V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
soralley
V2EX  ›  问与答

python 类与实例

  •  
  •   soralley · 2013-10-10 14:17:27 +08:00 · 2723 次点击
    这是一个创建于 4091 天前的主题,其中的信息可能已经有所发展或是发生改变。
    class A:
    def __init__(self, aList = []):
    self.aList = aList

    x = A()
    y = A()

    x.aList.append(...)为什么会影响到y.aList值?aList是共享的属性?怎样分离开来?
    7 条回复    1970-01-01 08:00:00 +08:00
    soralley
        1
    soralley  
    OP
       2013-10-10 14:19:29 +08:00
    发现self.aList = aList[:]这样就可以分离开来了,但好像不容易理解,还请高手解疑!
    tedd
        2
    tedd  
       2013-10-10 14:20:42 +08:00
    参数最好不要用可变的类型吧,很容易相互相应到的
    est
        3
    est  
       2013-10-10 14:24:34 +08:00
    def __init__(self, aList = []):

    这里的 [] 其实是隐含申明成全局变量了。

    def __init__(self, aList = None):
    if not aList: aList = []

    这样ok了。
    clino
        4
    clino  
       2013-10-10 14:31:16 +08:00
    好像 http://v2ex.com/t/75013 说的就是这个吧
    如果用
    x = A([])
    y = A([])
    就不会了,或者
    def __init__(self, aList = None):
    if aList==None:aList = []
    self.aList = aList
    这样也可以
    soralley
        5
    soralley  
    OP
       2013-10-10 14:34:52 +08:00
    最新发现,把默认参数拉长了就不会,好像是编译优化的问题,恩,好像
    est兄正解
    dreampuf
        6
    dreampuf  
       2013-10-10 16:38:28 +08:00
    In [75]: def FuncA(ls=[]): ls.append(1)

    In [76]: FuncA.func_defaults
    Out[76]: ([],)

    In [77]: FuncA()

    In [78]: FuncA.func_defaults
    Out[78]: ([1],)

    In [79]: FuncA()

    In [80]: FuncA.func_defaults
    Out[80]: ([1, 1],)
    piglei
        7
    piglei  
       2013-10-10 17:39:16 +08:00
    不要使用可变类型来作为方法的默认值,具体可以了解:
    http://effbot.org/zone/default-values.htm
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   916 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:28 · PVG 06:28 · LAX 14:28 · JFK 17:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.