Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在第二次导入时更改了值的地址_Python_Python 2.7_Python Import_Memory Address_Python Module - Fatal编程技术网

Python 在第二次导入时更改了值的地址

Python 在第二次导入时更改了值的地址,python,python-2.7,python-import,memory-address,python-module,Python,Python 2.7,Python Import,Memory Address,Python Module,我很难理解为什么在这种情况下,当我导入一个定义变量的模块并从一个模块访问它时,它有一个地址,而当稍后在另一个模块中导入定义模块时,它又有另一个地址 测试用例: #definer.py value = 0 #firstModule.py import definer print(id(definer.value)) # outputs i.e. 1453872004 #otherModule.py import definer print(id(definer.value)) # outp

我很难理解为什么在这种情况下,当我导入一个定义变量的模块并从一个模块访问它时,它有一个地址,而当稍后在另一个模块中导入定义模块时,它又有另一个地址

测试用例:

#definer.py
value = 0

#firstModule.py
import definer
print(id(definer.value))  # outputs i.e. 1453872004

#otherModule.py
import definer
print(id(definer.value))  # outputs 1453872212
它不应该是相同的,因为在
otherModule.py
中,它正在导入缓存的
definer.py
,因此它应该访问已经创建的对象,或者我是否错过了导入点?otherModule是创建本地副本还是确实在创建新的价值

 enable_generated_tests_p  cat firstModule.py
import definer
import os

print('pid:',os.getpid(), 'definer.value:',id(definer.value))

 enable_generated_tests_p  cat secondModule.py
import definer
import os

print('pid:',os.getpid(), 'definer.value:',id(definer.value))

 enable_generated_tests_p  cat ThirdModule.py
import firstModule
import secondModule

 enable_generated_tests_p  python firstModule.py
pid: 73848 definer.value: 4565266656

 enable_generated_tests_p  python secondModule.py
pid: 73906 definer.value: 4428878048

 enable_generated_tests_p  python ThirdModule.py
pid: 73964 definer.value: 4442521824
pid: 73964 definer.value: 4442521824
id()-返回对象的“标识”。这是一个整数,保证该对象在其生存期内唯一且恒定。两个生命周期不重叠的对象可能具有相同的id()值


在您的情况下,您一直在使用不同的进程/子进程运行firstModule和secondModule,因此您得到了如上所示的不同ID。

您是从同一进程调用这些方法吗?我无法复制;只要将
firstModule
otherModule
导入到同一个Python进程中,
definer.value
就会匹配。您的示例代码似乎不是a,因为您无法显示如何导入
firstModule
/
otherModule
;如果在单独的进程中执行此操作,则可能会出现不匹配。@ShadowRanger这两个导入都是在主进程中进行的。不幸的是,是的,我没有指定在其他进程中完成某些工作,但据我所知,线程中的线程具有共享内存。@ntrme:这些
id
s是否在同一进程中被
print
ed?在CPython引用解释器中,
0
是一个单例(实现细节),因此即使您做了一些奇怪的事情,导致在两个位置重新定义
value
id
也会匹配,除非您涉及单独的进程(即使如此,我认为只有在Windows上使用
子流程
多处理
时才会出现这种情况,在Windows上,工作程序是通过spawn而不是fork生成的)。或者,您的任何代码是否分配给
definer.value
?如果是,则分配后
id
将更改。@ShadowRanger是的,代码中有分配,但稍后在打印语句之后。打印语句是从一个线程(主线程)生成的,进行了双重检查。因此,我重新安排了代码,从现在起,我不仅访问值并使用它,而是创建一个对象,在其中设置并获取该值。现在它按预期工作,这意味着我使用一个对象(在特定地址)稍后,所有线程都会使用这个对象。我将尝试在简单设置中复制初始问题,并尽快更新问题。无论如何,谢谢。