chcp
-windows命令
输入chcp命令会显示当前的活动代码页编号
C:\Users\xlgui>chcp
活动代码页: 936
# 文件1.txt使用的是utf-8编写, 此时出现乱码
C:\Users\xlgui>type 1.txt
hello world
浣犲ソ, 涓栫晫
------------------------------
这个就是因为代码页编号不匹配的原因
把当前窗口活动代码页设置为65001就可以了,65001就是utf-8,输入命令chcp 65001。
C:\Users\xlgui>chcp 65001
Active code page: 65001
C:\Users\xlgui>type 1.txt
hello world
你好, 世界
locals()
内置函数
locals() 函数会以字典类型返回当前位置的全部局部变量。
>>>def f(arg): # 两个局部变量:arg、z
... z = 1
... print (locals())
...
>>> runoob(4)
{'z': 1, 'arg': 4} # 返回一个名字/值对的字典
exec()
内置函数
exec 执行储存在字符串或文件中的 Python 语句
exec(object[, globals[, locals]])
参数
object:必选参数,表示需要被指定的 Python 代码。
它必须是字符串或 code 对象。如果 object 是一个字符串,
该字符串会先被解析为一组 Python 语句,然后再执行(除非发生语法错误)。
如果 object 是一个 code 对象,那么它只是被简单的执行。
globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,
则必须是一个字典对象。
locals:可选参数,表示当前局部命名空间(存放局部变量),
如果被提供,可以是任何映射对象。如果该参数被忽略,
那么它将会取与 globals 相同的值。
返回值
exec 返回值永远为 None。
>>>exec('print("Hello World")')
Hello World
# 单行语句字符串
>>> exec("print ('runoob.com')")
runoob.com
# 多行语句字符串
>>> exec ("""for i in range(5):
... print ("iter time: %d" % i)
... """)
iter time: 0
iter time: 1
iter time: 2
iter time: 3
iter time: 4
---------------------------------------
x = 10
expr = """
z = 30
#print(x, y, z)
sum = x + y + z
print(sum)
"""
def func():
y = 20
exec(expr)
exec(expr, {'x': 1, 'y': 2})
exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
func()
输出结果:
60
33
34
得出这些结果的原则: 就近原则
先拿局部变量locals, 再拿全局变量globals
重点:
并且如果提供了locals或globals, expr中的变量就不会再取外部的x=10了
例如
x=10
expr = """
z=30
print(x, y, z)
# s = x+y+z
# print(s)
"""
def f():
y = 20
exec(expr)
exec(expr, {'a':1})
f()
直接报错 NameError: name 'x' is not defined
即如果为表达式expr提供了变量globals或locals,
代码中的其它变量便与表达式expr再无瓜葛