尽管Python里一切都是引用,但外部传参,在函数内修改该变量,并不一定能影响到函数外部。例如:
def test(arg):
arg = 100
arg = 0
test(arg)
arg还是为0,字符串、数字类型,都如此。而list和dict却不一样。例如:
def test(arg):
arg.append(123)
arg = []
test(arg)
arg的值就变成了[123]
。但如果arg被直接赋值,就跟简单类型一样了。
python里有globals()
和locals()
两个函数,用以获取全局变量和局部变量。 下面的代码是有问题的:
g_arg = 0
def test():
print(g_arg)
g_arg = 100
print(g_arg)
test()
g_arg = 0
def test():
g_arg = g_arg + 1
test()
而下面的代码是没有问题的:
g_arg = 0
def test():
print(g_arg)
print(g_arg)
test()
g_arg = 0
def test():
t_arg = g_arg
t_arg = t_arg + 1
test()
python函数里,会先在局部变量里查找,再在全局变量里查找。 而遇到赋值语句时,被赋值变量名会提前添加到函数的局部变量里,此时没有类型没有值,所以还不能引用。 否则会出“referenced before assignment”的错误。
函数里引用全局变量,有两种方式,可以:
g_arg = 0
def test():
globals()['g_arg'] = 100
test()
也可以:
g_arg = 0
def test():
global g_arg
g_arg = 100
test()
python里都是引用,一定范围内的整型和字符串都是赋值就引用一个新的,而不是复用一块内存, 所以代码写得不注意还是挺费内存的。下面的代码可以验证这点:
sum = 1
for i in xrange(10):
sum = sum + 1
print(id(sum))
以及:
sum = 12345
for i in xrange(10):
sum = sum + 1
print(id(sum))
python中删除一个list的某个元素,按如下方法是不行的:
l = [12,123,456]
for i in l:
if i == 123:
del i
有这么一些方法可供选择:
for i,v in enumerate(l):
if v == 123:
del l[i]
l.remove(123)
l.pop()
l = l[:index] + l[index+1:]
在Python中,支持a += 1
、a -= 1
、a *= 10
之类的写法,但不支持a++
和++a
的写法。
同时,在C++中此种写法:
max = a > b ? a : b
等价于Python中的如下写法:
max = a if a > b else b
如下代码创建一个dict,不同之处在于,默认值为一个空串:
s = collections.defaultdict(str)