一次分配多个变量,Python

一次分配多个变量,Python,python,variables,variable-assignment,Python,Variables,Variable Assignment,有更好的方法吗 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=“yyy”,但需要在内存中创建元组,而且a,b,c仍然只是对同一对象的引用 对于不同id的使用: a, b, c = ("yyy" for _ in xra

有更好的方法吗

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=“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], [], [])
上述构造相当于
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], [], [])

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

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')
如果右侧表达式是可变的,并且希望
a
b
c
具有独立的对象,则不要使用此选项;使用生成器表达式,然后:

a, b, c = ({} for _ in range(3))
或者更好的是,不要这么懒,直接把它们打印出来:

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

这并不是说左手赋值是动态的。

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

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')
如果右侧表达式是可变的,并且希望
a
b
c
具有独立的对象,则不要使用此选项;使用生成器表达式,然后:

a, b, c = ({} for _ in range(3))
或者更好的是,不要这么懒,直接把它们打印出来:

a, b, c = {}, {}, {}
这并不是说你的左手作业是动态的。

“…这个逻辑说a、b和c是相同的…”不,那将是
a==“yyy”和b==“yy”和c==“yyy”
<代码>=是赋值,永远不相等。“…这个逻辑说a、b和c是相同的…”不,那将是
a==“yyy”和b==“yyy”和c==“yyy”
<代码>=是赋值,从不相等。