python - 脚本和解释器之间的奇怪区别:不能在 __init__ 函数中引用类属性作为默认参数
问题描述
class f:
x = 5
def __init__(self, bar = f.x):
self.bar = bar
def fn(r, test = print(f.x)):
return r
我在 python 解释器(IDLE)中运行了上面的代码,它运行得非常好。然后,我将代码粘贴到 atom 中并以交互模式运行代码,它返回以下错误:
Traceback (most recent call last):
File "testing.py", line 28, in <module>
class f:
File "testing.py", line 30, in f
def __init__(self, bar = f.x):
NameError: name 'f' is not defined
为什么有区别?为什么没有定义“f”?我认为当python命中类语句时,是创建一个类对象,然后在类体内继续创建函数对象。
解决方案
函数参数的默认值是在定义函数时计算的。但是在类定义完成之前,您不能引用一个类。
当您在 IDLE 中执行此操作时,我怀疑您之前有一个定义,f
并且您正在重新定义它。在新定义完成之前,旧定义仍然有效,因此f.x
引用了 的旧值f.x
。
当你把它放在一个脚本中时,它是从新开始的,所以没有以前的定义,并且在函数定义期间f
尝试评估时出错。f.x
作为一个更简单的例子,考虑如下语句
x = x + 1
如果你把它单独放在一个脚本中,你会得到一个错误。但是如果你在 IDLE 中使用它,并且你之前已经做过
x = 3
在同一个空闲会话中,它会起作用。
推荐阅读
- php - 我正在尝试在 php 中运行查询,它在 phpMyAdmin 中工作,但不在脚本中
- spring-cloud-stream - org.springframework.messaging.converter.AbstractMessageConverter。
([Lorg/springframework/util/MimeType;)V Spring Cloud Stream - python - kochat -chatbot : 无法写入核心转储。默认情况下,在客户端版本的 Windows 上不启用 minidump
- encryption - 什么是字符串压缩算法?
- amazon-web-services - 如何让 docker 容器使用 codebuild IAM 身份验证来部署到 AWS?
- python - 如何使用 PIL 和 numpy 按行打乱 .jpg 图像的像素
- c++ - 当“if”条件为假时,变量“hasil”未初始化使用
- javascript - Jest 在全局级别模拟函数实现
- python - selenium.common.exceptions.WebDriverException:消息:进程意外关闭,状态为 -1073740791
- sql - ACCESS - 如何根据 SQL SELECT ANY 语句为 false 更新特定记录中的字段