python语言的一些注意事项

关于局部变量和全局变量

尽管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

有这么一些方法可供选择:

  1. 还是使用循环便利
for i,v in enumerate(l):
    if v == 123:
        del l[i]
  1. 直接使用故有方法l.remove(123)
  2. 如果是要删除末尾元素,使用l.pop()
  3. 用切片再创建一个l = l[:index] + l[index+1:]

最后一些闲话

在Python中,支持a += 1a -= 1a *= 10之类的写法,但不支持a++++a的写法。

同时,在C++中此种写法:

max = a > b ? a : b

等价于Python中的如下写法:

max = a if a > b else b

如下代码创建一个dict,不同之处在于,默认值为一个空串:

s = collections.defaultdict(str)
发表于 2014年09月16日 00:07   评论:0   阅读:2112  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo