有人可以向我解释一下吗?这对我没有任何意义.
我将字典复制到另一个字典中并编辑第二个字典,然后更改两个字典 为什么会这样?
>>> dict1 = {"key1": "value1", "key2": "value2"}
>>> dict2 = dict1
>>> dict2
{'key2': 'value2', 'key1': 'value1'}
>>> dict2["key2"] = "WHY?!"
>>> dict1
{'key2': 'WHY?!', 'key1': 'value1'}
Run Code Online (Sandbox Code Playgroud) 我已经在谷歌和Stackoverflow上进行了搜索,但找不到我想要的内容.
我对Python比较陌生.我希望创建一个"设置"模块,其中将存储各种特定于应用程序的常量.
这是我想要设置我的代码的方式
settings.py
CONSTANT = 'value'
Run Code Online (Sandbox Code Playgroud)
script.py
import settings
def func():
var = CONSTANT
# do some more coding
return var
Run Code Online (Sandbox Code Playgroud)
我收到一条Python错误说明:"全局名称'CONSTANT'未定义.
我注意到Django的源代码,他们的settings.py文件有像我一样命名的常量.我对如何将它们导入脚本并通过应用程序引用感到困惑.
编辑
谢谢你的所有答案!我尝试了以下方法:
import settings
print settings.CONSTANT
Run Code Online (Sandbox Code Playgroud)
我得到相同的错误:ImportError:无法导入名称CONSTANT
在Python中,是否存在C预处理器语句的类似物,例如?:
#define MY_CONSTANT 50
另外,我有一个很大的常量列表,我想导入几个类.是否有类似的方法将常量声明为.py文件中的上述长序列语句并将其导入另一个.py文件?
编辑.
该文件Constants.py为:
#!/usr/bin/env python
# encoding: utf-8
"""
Constants.py
"""
MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51
Run Code Online (Sandbox Code Playgroud)
并myExample.py读:
#!/usr/bin/env python
# encoding: utf-8
"""
myExample.py
"""
import sys
import os
import Constants
class myExample:
def __init__(self):
self.someValueOne = Constants.MY_CONSTANT_ONE + 1
self.someValueTwo = Constants.MY_CONSTANT_TWO + 1
if __name__ == '__main__':
x = MyClass()
Run Code Online (Sandbox Code Playgroud)
编辑.
从编译器,
NameError:"未定义全局名称'MY_CONSTANT_ONE'"
第13行的myExample中的函数init self.someValueOne = Constants.MY_CONSTANT_ONE + 1复制输出程序在0.06秒后退出代码#1.
这是我如何声明常量并在不同的Python类中使用它们:
# project/constants.py
GOOD = 1
BAD = 2
AWFUL = 3
# project/question.py
from constants import AWFUL, BAD, GOOD
class Question:
def __init__(self):
...
Run Code Online (Sandbox Code Playgroud)
以上是存储和使用含有值的好方法吗?我意识到,经过一段时间后,常量文件会变得非常大,我可以明确地在任何给定文件中导入10个以上的常量.
在尝试做类似于Alex Martelli 的ActiveState配方标题为Python中的Constants时,我遇到了意外的副作用(在Python 2.7中),它将类实例分配给sys.moduleshas中的一个条目- 即显然这样做更改__name__to 的值,None如下面的代码片段所示(它会破坏配方中的部分代码):
class _test(object): pass
import sys
print '# __name__: %r' % __name__
# __name__: '__main__'
sys.modules[__name__] = _test()
print '# __name__: %r' % __name__
# __name__: None
if __name__ == '__main__': # never executes...
import test
print "done"
Run Code Online (Sandbox Code Playgroud)
我想知道为什么会这样.我不相信它在Python 2.6和早期版本中是这样的,因为我有一些较旧的代码,显然if __name__ == '__main__':条件在赋值后按预期工作(但不再有).
FWIW,我也注意到这个名字在分配后也会_test从一个类对象反弹None回来.我觉得很奇怪他们正在反弹None而不是完全消失......
更新:
我想补充一点,任何实现效果的变通办法if __name__ == '__main__':都会受到高度赞赏.TIA!
如果我声明一个包含变量的const类:
例如
class const:
MASTER_CLIENT_CONNECTED = 0
CLIENT_CONNECTED = 1
GET_SERVER_QUEUE = 9998
ERROR = 9999
Run Code Online (Sandbox Code Playgroud)
有没有办法在不创建新类的情况下达到这个变量(常量).
像这样:
import const
const.MASTER_CLIENT_CONNECTED
Run Code Online (Sandbox Code Playgroud)
要么
import const
if(i==MASTER_CLIENT_CONNECTED):
Run Code Online (Sandbox Code Playgroud) 我有 C# 背景,但现在使用 Python 3.x 进行大量科学计算工作,因此我想了解一下我的风格或口音按照 Python 标准有多“奇怪”。
特别是,Python 中没有这样的东西,这让我非常恼火const。我的用例是这样的:我正在保存*.npz文件(numpy 序列化数据字典)、传递字典、写入文件等,并且字典键、文件名等需要具有一致、可靠的命名模式。
很明显,在 8 个地方输入相同的神奇愚蠢字符串是错误的。
所以在我的模块根目录中,我有一个通常调用的文件base.py:
import os
from collections import namedtuple
from os import path
# This is the tuple that contains operational constants
RuntimeConstants = namedtuple("Const", " ModelDirectoryLabelName \
DefaultModelOutputDirectoryRoot \
ResultDirectoryNameFormat \
PeripheryOutputFilePrefix \
NCOutputFilePrefix \
SummaryPlotFileName \
PeripheryConfigurationName \
ResourceDirectoryName \
StimulusTemplateName")
runtime_consts = RuntimeConstants(ModelDirectoryLabelName=".model-output-root",
DefaultModelOutputDirectoryRoot="model-output",
ResultDirectoryNameFormat="%d %b %y - %H%M",
PeripheryOutputFilePrefix="periphery-output-",
NCOutputFilePrefix="nc-output-",
PeripheryConfigurationName="simulation-configuration.yaml",
SummaryPlotFileName="summary-plots.pdf",
ResourceDirectoryName="resources",
StimulusTemplateName="default_stimulus.yaml"
)
# This is …Run Code Online (Sandbox Code Playgroud)