我认为python是一种解释型语言,但根据下面的代码片段,它显然不是我所期望的?我对此做了一些搜索,发现如果在函数中对一个名称进行了赋值,python将隐式地将该名称‘声明’为local。所以它在解释代码时确实做了一些静态分析,但我的问题是多大程度上?例如,如下面的代码所示,当x=1不可达时,它不是也会优化吗?我们有关于如何解释代码的更多细节吗?谢谢
x = 10
def f():
if False: x = 1
print x
UnboundLocalError: local variable 'x' referenced before assignment
#This code does the checking of the function input.
import re
import sys
def pyexam(file_name):
fp = open(file_name)
testCaseInput = open('input.txt','r')
testCaseOutput = open('output.txt','r')
eval(compile(fp.read(),'prob.txt','exec&
我希望印出来的值是"200!“"404!“在Python3.4。但我得到的结果是"200!“还有“否则!”
我做了一个奇怪的面孔,然后在C中再次尝试,C中的结果与Python3中的结果不一样。为什么?
Python3.4码
def chk(s):
if s is 200:
print('200!')
elif s is 404:
print('404!')
else:
print('else!')
chk(200)
chk(404)
Python3
我目前正在修改变量作用域以及如何修改/复制它们,因为我希望在IPython中动态地处理一些结果。对我来说,关于局部变量()、vars()和globals()的混淆是真实的。特别是因为这段代码的输出:
Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more
我知道有大量关于指针和引用的资源(或者更确切地说:名称和绑定!)在Python中,但我很难理解最后一点:
如果a = 1和b = 1都被“绑定”到相同的1,并且具有相同的id() (因此,我认为内存地址),我就知道了。我也明白如果你设置:
a = [1, 2, 4]
b = a
b[0] = 45
# a is now [45, 2, 4]
因为a和b绑定到同一个列表(对象),而其中的更改导致对另一个列表的更改。同样,a[0]和b[0]是同一个对象。该列表包含具有不同is的其他对象--也就是列表标识不绑定到其内容。
好吧。到目前一切尚好。我可以接受这样一个事实:有“未出生”列表和数字在等待初始
在接触了Python更深入的工作之后,我的理解是,分配变量等于创建一个具有自己特定地址的新对象,而不管分配给对象的变量名如何。
但是,在这种情况下,我想知道后来创建和修改的对象发生了什么。它会坐在那里消耗记忆吗?
脑海中的场景是这样的:
# Creates object with id 10101001 (random numbers)
x = 5
# Creates object with id 10010010 using the value from object 10101001.
x += 10
使用id 10101001的对象会发生什么情况?出于好奇,为什么对象需要一个ID和一个
在python中,2 is 2和3 is 3似乎总是正确的,一般来说,对整数的任何引用都与对同一个整数的任何其他引用相同。同样的情况发生在None (即None is None)上。我知道这种情况不会发生在用户定义的类型或可变类型上。但有时在不可变类型上也会失败:
>>> () is ()
True
>>> (2,) is (2,)
False
也就是说:空元组的两个独立结构在内存中产生对同一个对象的引用,但是两个相同的(不变的)元素元组的独立构造最终创建了两个相同的对象。我进行了测试,frozenset的工作方式类似于元组。
是什么决定了一个对象是在内存中
在Python中,每个整数似乎都有一个从438开始的10位id。我在试图找到一个和它的id相同的数字。我编写了一个简单的代码来查找数字:
for i in range(4380000000,4390000000):
if i==id(i):
print(i)
else:
pass
当我第一次运行这个的时候,我没有这样的号码。然后我第二次跑了,但还是没有号码。
当我第三次运行它时,我得到了一个号码: 4384404848。
然后我检查了id(4384404848)==4384404848和我是否得到了False。
为什么Python返回一个与其id
请有人告诉我,以下是否是线程安全,如果不是,我必须做什么才能做到这一点。
注意:这只是一个小样本,不确定它是否运行。
TIMER = True
time_lock = threading.Lock()
def timing():
while TIMER:
# some logic will be here for now print time
print time.time()
timer = threading.Thread(target=timing)
timer2 = threading.Thread(target=timing)
timer.s
我想在C#中使用IronPython运行一个python脚本。除了IronPython使用我的基本Python安装而不是Anaconda环境之外,它工作得很好。
我尝试将脚本作为一个普通进程运行(即没有IronPython),并将脚本作为参数传递。这是可行的,但我失去了IronPython的功能。例如,询问Python变量的能力。
我还尝试将"Python“字符串替换为Python.exe在我的anaconda环境中的位置以及Anaconda环境的名称,但是它会导致”未知语言“错误。
var runtime = Python.CreateRuntime();
var engine =
def f():
print("Before", locals()) # line 2
print(x); # line 3
x = 2 # line 4
print("After", locals()) # line 5
x = 1
f()
我知道在Python中定义范围的LEGB规则。
对于上面的代码,当我注释掉第4行时,一切都按预期正常执行:对于第3行,在本地作用域中找不到变量x,因此在全局范围中搜索变量x并打印1。
但是,当我不加