簡體   English   中英

在Python中初始化關鍵字args

[英]Initialisation of keyword args in Python

為什么執行以下操作:

class A(object):
    def __init__(self, var=[]):
        self._var = var
        print 'var = %s %s' % (var, id(var))

a1 = A()
a1._var.append('one')

a2 = A()

造成:

var = [] 182897439952
var = ['one'] 182897439952

我不明白為什么使用可選關鍵字參數時沒有使用列表的新實例,有人可以解釋嗎?

函數定義中的空列表在創建函數本身時被創建一次。 並非在每次調用函數時都創建它。

如果您每次都想要一個新的,請執行以下操作:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var

這是完全錯誤的。 您不能(有意義地)在函數聲明中提供可變對象作為默認值。

class A(object):
    def __init__(self, var=[]):
        self._var = var
        print 'var = %s %s' % (var, id(var))

您必須執行這樣的操作。

class A(object):
    def __init__(self, var=None):
        self._var = var if var is not None else []
        print 'var = %s %s' % (var, id(var))

函數定義中的空列表在創建函數本身時被創建一次。 並非在每次調用函數時都創建它。

究竟。 要變通解決此問題,請在函數定義中分配None並在函數主體中檢查None:

class A(object):
    def __init__(self, var=None):
        if var is None:
            var = []
        self._var = var
        print 'var = %s %s' % (var, id(var))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM