Python范围规则究竟是什么?
如果我有一些代码:
code1
class Foo:
code2
def spam.....
code3
for code4..:
code5
x()
Run Code Online (Sandbox Code Playgroud)
在哪里x找到?一些可能的选择包括以下列表:
在执行期间,当函数spam在其他地方传递时,也存在上下文.也许lambda函数的传递方式有点不同?
某处必须有简单的参考或算法.对于中级Python程序员来说,这是一个令人困惑的世界.
所以,我想"恶"的东西奈德Deily在他的回答中提到这里.现在我认为类型True现在总是为假.如何在交互式窗口中反转此操作?
不要这样做:
True = False
Run Code Online (Sandbox Code Playgroud)
由于True现在已被False完全覆盖,因此似乎没有明显的回溯方式.是否存在True来自的模块,我可以执行以下操作:
True = <'module'>.True
Run Code Online (Sandbox Code Playgroud) 码:
import urllib2 as u
import os as o
inn = 'dword.txt'
w = open(inn)
z = w.readline()
b = w.readline()
c = w.readline()
x = w.readline()
m = w.readline()
def Dict(Let, Mod):
global str
inn = 'dword.txt'
den = 'definitions.txt'
print 'reading definitions...'
dell =open(den, 'w')
print 'getting source code...'
f = u.urlopen('http://dictionary.reference.com/browse/' + Let)
a = f.read(800)
print 'writing source code to file...'
f = open("dic1.txt", "w")
f.write(a)
f.close()
j = open('defs.txt', 'w')
print 'finding definition is source …Run Code Online (Sandbox Code Playgroud) 当我在探索StackOverflow问题的解决方案,Python使用用户定义的字符串类时,我遇到了这种奇怪的python行为.
def overriden_print(x):
print "Overriden in the past!"
from __future__ import print_function
print = overriden_print
print("Hello World!")
Run Code Online (Sandbox Code Playgroud)
输出:
Overriden过去!
现在,我怎样才能print在python解释器中找回原来的行为?
我犯了一个错误如下:
>>> list = ['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)
但现在我想使用内置函数list().如您所见,listname list和内置函数之间存在命名冲突list().
list如果不重新启动Python shell,我如何使用内置函数而不是变量?
在Python 3.3.1中,这适用于:
i = 76
def A():
global i
i += 10
print(i) # 76
A()
print(i) # 86
Run Code Online (Sandbox Code Playgroud)
这也有效:
def enclosing_function():
i = 76
def A():
nonlocal i
i += 10
print(i) # 76
A()
print(i) # 86
enclosing_function()
Run Code Online (Sandbox Code Playgroud)
但这不起作用:
i = 76
def A():
nonlocal i # "SyntaxError: no binding for nonlocal 'i' found"
i += 10
print(i)
A()
print(i)
Run Code Online (Sandbox Code Playgroud)
nonlocal关键字状态的文档(强调添加):
非本地语句使列出的标识符引用最近的封闭范围中的先前绑定的变量.
在第三个例子中,"最近的封闭范围"恰好是全局范围.那为什么不起作用呢?
我注意到文档继续进行状态(强调添加):
除了全局(模块)范围
nonlocal之外,[ ]语句允许封装代码重新绑定局部范围之外的变量.
但是,严格地说,这并不意味着我在第三个例子中所做的事情不应该起作用.
我正在使用python程序,作者编写了一个看起来像这样的函数
def blah():
str = "asdf asdf asdf"
doStuff(str)
Run Code Online (Sandbox Code Playgroud)
即使str是内置函数,也不应将其用作变量,这似乎可行。
这里到底发生了什么?我的猜测是str将不再可用作函数,而只能在他编写的blah()函数的范围内使用。那是对的吗?这不会在全球范围内重新定义str,对吗?
在遵循python教程的同时,我知道我们可以使用print作为变量名,并且它工作正常.但在分配打印变量后,我们如何取回原始打印功能?
>>> print("Hello World!!")
Hello World!!!
>>> print = 5
>>> print("Hi")
Run Code Online (Sandbox Code Playgroud)
现在,最后一次调用给出了错误TypeError:'int'对象不可调用,因为现在print的整数值为5.
但是,我们现在如何取回打印的原始功能?我们应该使用类名作为打印功能吗?如,SomeClass.print("Hi")?
提前致谢.
尝试使用Python解释器,我无意中分配了一个字符串,str如下所示:
str = 'whatever'
Run Code Online (Sandbox Code Playgroud)
后来在同一场会议上,我打电话给另一个声明str(),说......
double_whatever = str(2) + ' * whatever'
Run Code Online (Sandbox Code Playgroud)
...,并得到错误TypeError: 'str' object is not callable(而不是预期的输出'2 * whatever').一个相关的SO答案帮助我快速看到了我犯的错误.
但是,我仍然不清楚如何str()在受影响的会话中修复呼叫.当然我可以退出Python解释器并启动另一个会话,但我很好奇如何避免这种情况.
到目前为止,我已确认......
double_whatever = __builtins__.str(2) + ' * whatever' # => '2 * whatever'
Run Code Online (Sandbox Code Playgroud)
...仍然像我想要的那样工作; 但我不清楚如何回到不需要__builtins__.资格.
如何修复我无意识的重新定义,str以便我str()在Python-interpreter会话中的调用再次起作用?
_我已经覆盖了Python交互式解释器中的下划线变量。如何在不重新启动解释器的情况下使下划线再次工作?
x = [1, 2, 3, ... ]
y = sum(x)
Run Code Online (Sandbox Code Playgroud)
总和x是2165496761,它大于32位整数的限制因此sum(x)返回-2129470535.
如何通过将其转换为长整数来获得正确的值?
这是我的导入列表:
import math, csv, sys, re, time, datetime, pickle, os, gzip
from numpy import *
Run Code Online (Sandbox Code Playgroud) 如果有人使用内置的python作为变量,删除该变量似乎将该术语的定义恢复为原始定义.例如:
set = 1
print(set)
del set
a = set([1,2,3])
print(a)
Run Code Online (Sandbox Code Playgroud)
结果:
1
{1, 2, 3}
Run Code Online (Sandbox Code Playgroud)
但是,当您从头开始删除内置函数时,不再定义它:
del set
a = set([1,2,3])
print(a)
Run Code Online (Sandbox Code Playgroud)
结果:
NameError: name 'set' is not defined
我理解使用内置函数作为变量是不好的做法,但我对这个设计决策感到好奇:
如果python源代码可以通过将删除的变量分配给它们的原始内置值来智能地恢复它们,为什么代码允许在我的第二个示例中删除内置函数?允许删除内置函数有什么可能的效用?
不,我没有现实世界的用例; 我只是想了解设计决定.
python ×12
python-2.7 ×2
python-3.x ×2
boolean ×1
built-in ×1
cpython ×1
integer ×1
list ×1
long-integer ×1
python-2.x ×1
scope ×1
string ×1