在 Python 中,cnt = i = 0
和 cnt = 0; i = 0
(或分开写 cnt = 0
和 i = 0
)在大多数情况下是等效的,但它们的执行方式略有不同。
1. cnt = i = 0
(链式赋值)
- 含义:同时将
0
赋值给cnt
和i
。 - 执行顺序:
- 先计算
0
(这是一个常量,无需计算)。 - 然后从右向左赋值:
i = 0
cnt = i
(此时i
已经是0
)
- 先计算
- 特点:
- 更简洁,适用于同时初始化多个变量为相同的值。
- 如果右侧是一个表达式(如
cnt = i = some_function()
),则i
和cnt
会得到相同的值。
示例:
cnt = i = 0
print(cnt, i) # 输出: 0 0
2. cnt = 0; i = 0
(分开赋值)
- 含义:分别给
cnt
和i
赋值为0
。 - 执行顺序:
cnt = 0
(直接赋值)i = 0
(直接赋值)
- 特点:
- 更明确,适用于需要分别初始化不同变量。
- 如果右侧是表达式(如
cnt = some_function(); i = another_function()
),可以分别计算不同的值。
示例:
cnt = 0
i = 0
print(cnt, i) # 输出: 0 0
关键区别
情况 | cnt = i = 0 | cnt = 0; i = 0 |
---|---|---|
赋值方式 | 链式赋值(从右向左) | 分开赋值 |
适用场景 | 多个变量初始化为相同的值 | 变量可以初始化为不同的值 |
右侧表达式影响 | 如果右侧是函数调用,cnt 和 i 会得到相同结果 | 可以分别计算不同的值 |
特殊情况
如果右侧是一个可变对象(如列表),链式赋值可能导致变量共享引用:
a = b = [] # a 和 b 指向同一个列表
a.append(1)
print(b) # 输出 [1],因为 a 和 b 是同一个对象
而分开赋值则不会:
a = []
b = [] # a 和 b 是两个不同的列表
a.append(1)
print(b) # 输出 [],因为 b 是独立的
结论
- 如果只是初始化简单的不可变类型(如
int
,str
,tuple
),cnt = i = 0
和分开写cnt = 0; i = 0
效果相同。 - 如果涉及可变对象(如
list
,dict
)或函数调用,链式赋值可能导致变量共享引用,而分开赋值更安全。 - 推荐:
- 简单初始化用
cnt = i = 0
(简洁)。 - 复杂情况(如可变对象或不同初始值)用分开赋值(更清晰)。
- 简单初始化用