1. 程式人生 > >Python預設引數

Python預設引數

def add_end(list=[]):
    list.append("end")
    return list


# 預設引數多次呼叫,竟然每次結果不一樣
n = 0
while n < 5:
    print n, add_end()
    n += 1

列印結果:


很多初學者很疑惑,預設引數是[ ],但是函式似乎每次都“記住了”上次添加了'end'後的list。

原因解釋如下:

Python函式在定義的時候,預設引數list的值就被計算出來了,即[ ],因為預設引數L也是一個變數,它指向物件[ ],每次呼叫該函式,如果改變了list的內容,則下次呼叫時,預設引數的內容就變了,不再是函式定義時的[ ]了。

所以,定義預設引數要牢記一點:預設引數必須指向不變物件!

要修改上面的例子,我們可以用None這個不變物件來實現:

def add_end2(list=None):
    if list is None:
        list = []
    list.append("end")
    return list


print"**************"
n = 0
while n < 5:
    print n, add_end2()
    n += 1

列印結果:


為什麼要設計str、None這樣的不變物件呢?因為不變物件一旦建立,物件內部的資料就不能修改,這樣就減少了由於修改資料導致的錯誤。此外,由於物件不變,多工環境下同時讀取物件不需要加鎖,同時讀一點問題都沒有。我們在編寫程式時,如果可以設計一個不變物件,那就儘量設計成不變物件。

相關推薦

python預設引數的坑以及最佳實踐

// An example def addEnd(L=[]): L.append("end") return L print addEnd()#["end"] print addEnd()#["end", "end"]坑!!!對一切的列表有記憶了,不是我們想要的 pri

Python預設引數陷阱問題

def fun(a,l = []): l.append(a) print(l) fun('hhh') fun('mmmm') fun('xingkd') python中的def語句在

Python預設引數

def add_end(list=[]): list.append("end") return list # 預設引數多次呼叫,竟然每次結果不一樣 n = 0 while n < 5: print n, add_end() n +=

python 預設引數與關鍵字引數

如下函式定義 def hello(name, age=10, gender='F'):     print 'User Info:'    print 'name is %s' % name    print 'age is %d' % age    print

Python 預設引數 (2)

預設引數 新的power(x, n)函式定義沒有問題,但是,舊的呼叫程式碼失敗了,原因是我們增加了一個引數,導致舊的程式碼因為缺少一個引數而無法正常呼叫: >>> power(5) Traceback (most recent call

Python 3.X | 一文看懂不懵圈:位置引數(必選引數)、預設引數、可變引數、關鍵字引數、形參、實參...

Win 10+Python 3.6.3 不管是什麼引數,它們身處環境是:函式(function)。引數讓函式如虎添翼,靈活、強大。 1、概念釋義: def func(x, y=2, *arg, *, z, **kwargs): #print(x, y) #print(len(ar

Python基礎之定義有預設引數的函式

1. 構建有預設引數的函式 當我們在構建一個函式或者方法時,如果想使函式中的一個或者多個引數使可選的,並且有一個預設值,那麼可以在函式定義中給引數指定一個預設值,並且放到引數列表的最後就行了。比如: def func(a, b=42): print(a, b) func(1)

python中函式中的實參和形參以及預設引數和收集引數

一.實參和形參 例項:>>> def MyFirstFunction(name):                    ”函式定義過程中的hame是叫形參“ &nb

Python陷阱:為什麼不能用可變物件作為預設引數的值

上次分享過一篇關於圖解Python變數與賦值的文章,今天接著這個話題繼續聊一聊關於賦值的一些坑。先來看一道題目: >>> def func(numbers=[], num=1): ... numbers.append(num) ... return nu

Python有坑系列】函式預設引數

Python進階-函式預設引數 寫在前面 如非特別說明,下文均基於Python3 一、預設引數 python為了簡化函式的呼叫,提供了預設引數機制: def pow(x, n = 2): r = 1 while n > 0:

Python函式中的預設引數

# -*- coding: utf-8 -*- def hello(greeting='hello', name='world!'): print '%s,%s' % (greeting, name) hello() hello('I like you') def h

Python的位置引數預設引數、關鍵字引數、可變引數

普通引數 (位置引數) 定義的時候直接定義變數名,呼叫的時候直接把變數或者值放入指定的位置 呼叫的時候,具體參考的是位置,按位置賦值 語法: def 函式名 (引數1,引數2,……)

python 預設引數 別名 多個名稱同時表示一個引數

#python3 win10 def yy(background=0,bg=0): ''' 預設值引數別名的實現 ''' res = background if background != 0 else bg return res print(yy(backgr

python的位置引數預設引數、關鍵字引數、可變引數區別

一、位置引數 呼叫函式時根據函式定義的引數位置來傳遞引數。 #!/usr/bin/env python # coding=utf-8 def print_hello(name, sex): sex_dict = {1: u'先生', 2: u'女士'}

Python函式引數預設值的陷阱和原理深究 • cenalulu's Tech Blog

本文將介紹使用mutable物件作為Python函式引數預設值潛在的危害,以及其實現原理和設計目的 陷阱重現 我們就用實際的舉例來演示我們今天所要討論的主要內容。 下面一段程式碼定義了一個名為generate_new_list_with的函式。該函式的本意是在每次呼叫時都新建一個包含有給

Python引數 - > 必選引數預設引數、元組引數、字典引數(屌絲版)

#必選引數forceStr #預設引數defaultStr #元組引數tupleStr #字典引數dictStr def niuB(forceStr, defaultStr = "hi", *tupleStr, **dictStr): print forceStr print

Python中位置引數預設引數、可變引數、命名關鍵字引數、關鍵字引數的區別

Python中必選引數、預設引數、可變引數、命名關鍵字引數、關鍵字引數的區別: Num01–>必選引數(亦即位置引數): 定義:就是在給函式傳引數時,按照順序,依次傳值。 先寫一個下面的函式: def power(m, n): result=1

Python基礎筆記_Day07_函式引數傳遞、關鍵字引數預設引數、匿名函式、裝飾器

Day07_函式引數傳遞、關鍵字引數、預設引數、匿名函式、裝飾器 07.01_Python基礎語法(函式的引數的傳遞)(掌握) 07.02_Pythony語言基礎(關鍵字引數)(掌握) 07.03_Pythony語言基礎(預設引數/預設引數)(掌握) 07.04_Pythony語言基礎(

python的函式——進階(打包與拆包、不定長引數預設引數

整體: 1. 函式的返回值的打包與拆包 2. 為函式的引數設定預設值 3. 函式引數的打包與拆包 ----函式返回值的打包 def 函式名(引數列表): 函式體執行內容 return 返回值1,返回值2,返回值3,... 此時呼叫函式時,變數 = 函式名(傳參),變數

python 函式引數(必選引數預設引數、可選引數、關鍵字引數)

參考: ######################################################## 函式引數:必選引數、預設引數、可選引數、關鍵字引數 ##############################################