max*_*max 46 python language-design python-3.x
为什么Python赋值语句而不是表达式?如果它是一个表达式,它返回赋值中右侧的值,那么在某些情况下它会允许更简洁的代码.有什么问题我看不到吗?
例如:
# lst is some sequence
# X is come class
x = X()
lst.append(x)
Run Code Online (Sandbox Code Playgroud)
可以改写为:
lst.append(x = X())
Run Code Online (Sandbox Code Playgroud)
嗯,确切地说,上述方法不起作用,因为x它将被视为关键字参数.但另一对parens(或关键字参数的另一个符号)将解决这个问题.
Lau*_*ves 42
有许多人认为赋值是表达式,特别是在像Python这样的语言中,条件允许的任何值(不仅仅是某些布尔类型的值)都容易出错.据推测,Guido是那些有这种感觉的人.经典错误是:
if x = y: # oops! meant to say ==
Run Code Online (Sandbox Code Playgroud)
Python中的情况也比使用C语言更复杂,因为在Python中,对变量的第一个赋值也是它的声明.例如:
def f():
print x
def g():
x = h()
print x
Run Code Online (Sandbox Code Playgroud)
在这两个函数中," print x"行执行不同的操作:一个引用全局变量x,另一个引用局部变量x.因为作业,xin g是本地的.如果有可能将赋值放在一个更大的表达式/语句中,这可能会更加混乱(比现在已经多了).
Gle*_*ard 16
现实世界的答案:不需要它.
您在C中看到的大多数情况都是因为错误处理是手动完成的:
if((fd = open("file", O_RDONLY)) == -1)
{
// error handling
}
Run Code Online (Sandbox Code Playgroud)
类似地,对于写入许多循环的方式:
while(i++ < 10)
;
Run Code Online (Sandbox Code Playgroud)
这些常见情况在Python中以不同方式完成.错误处理通常使用异常处理; 循环通常使用迭代器.
反对它的论点不一定是惊天动地,但它们与它在Python中并不那么重要的事实相称.
ben*_*min 11
您可以期望(x := y)在不久的将来版本的python中实现对表达式的支持.Guido最近在2018年7月接受了一项PEP 572提案,以支持python中的赋值表达式.(之前也有过提案,例如撤回的PEP 379.)
回想一下,直到版本3,lst.append(x := X())它也是一个陈述而不是表达.
注:该语句print分配相同的值到多个目标(或者更确切地说,多目标列表,因为拆包也是允许的)已经长期支持Python,但作为一种特殊的实现语法,而不是通过链接连续分配的子表达式.(实际上,执行个人作业的顺序是相反的.)
我认为这是为了防止某些经典错误而故意在Guido的部分.例如
if x = 3: print x
当你真正想说的时候
if x == 3: ...
我不同意有次我希望它的工作,但我也想念{和}周围的代码块,那肯定是不会改变的.
| 归档时间: |
|
| 查看次数: |
17175 次 |
| 最近记录: |