【问题标题】:Assign Many Variables at Once, Python一次分配多个变量,Python
【发布时间】:2013-09-06 15:59:54
【问题描述】:

有没有更好的方法来做到这一点?

a, b, c, = "yyy", "yyy", "yyy"

明显的尝试失败

a, b, c, = "yyy"
a, b, c = "yyy"*3

从技术上讲,以下是可行的,但我认为这并不直观,因为这个逻辑表明 a、b 和 c 是相同的,而我要做的只是说它们初始化为相同的值

a=b=c="yyy"

【问题讨论】:

  • "... 这个逻辑说 a、b 和 c 是一样的..." 不,应该是 a == "yyy" and b == "yyy" and c == "yyy"= 是赋值,绝不是相等。

标签: python variables variable-assignment


【解决方案1】:

这里不需要使用元组赋值;右侧的值是不可变的,因此您也可以共享参考:

a = b = c = 'yyy'

在我看来,这根本不是不直观的,python 编译器只需要在字节码中存储一个常量,而使用元组赋值需要一个额外的元组常量:

>>> def foo():
...     a, b, c = 'yyy', 'yyy', 'yyy'
... 
>>> foo.__code__.co_consts
(None, 'yyy', ('yyy', 'yyy', 'yyy'))
>>> def bar():
...     a = b = c = 'yyy'
... 
>>> bar.__code__.co_consts
(None, 'yyy')

如果右手表达式是可变的并且您希望abc 拥有独立的对象,则不要使用它;然后使用生成器表达式:

a, b, c = ({} for _ in range(3))

或者更好的是,不要那么懒惰,把它们打出来:

a, b, c = {}, {}, {}

你的左手分配并不是动态的。

【讨论】:

    【解决方案2】:
    >>> a, b, c = ("yyy",)*3 
    

    上面的构造等价于a = b = c = "yyy",但需要在内存中创建一个元组,而a,b,c仍然只是对同一个对象的引用。

    对于不同的id的使用:

    a, b, c = ("yyy" for _ in xrange(3))
    

    这对于字符串无关紧要,因为它们是不可变的,但对于可变对象,它们是不同类型的赋值。

    >>> a = b = c = []       #all of them are references to the same object
    >>> a is b
    True
    >>> a.append(1)          #Modifying one of them in-place affects others as well
    >>> a, b, c
    ([1], [1], [1])
    >>> a, b, c, = ([],)*3   #same as a = b = c = []
    >>> a is b
    True
    
    #Here a, b, c point to different objects
    >>> a, b, c, = ([] for _ in xrange(3))
    >>> a is b
    False
    >>> a.append(1)
    >>> a, b, c
    ([1], [], [])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 2021-08-01
      • 2017-06-28
      • 2011-07-13
      • 2012-07-23
      • 1970-01-01
      • 2018-10-18
      相关资源
      最近更新 更多