Discuss / Python / 比较正确的做法(应该)

比较正确的做法(应该)

Topic source
def createCounter():
	list1 = [0]
	def counter():
		list1[0] = list1[0] + 1
		return list1[0]
	return counter

孤月情风

#2 Created at ... [Delete] [Delete and Lock User]

为啥列表可以,直接赋值不行呢?

def createCounter():
	n = 0
	def counter():
		n = n + 1
		return n
	return counter

>>>  nboundLocalError: local variable 'n' referenced before assignment

同问,求大神解答

水滴竹沙

#4 Created at ... [Delete] [Delete and Lock User]

个人理解 新计算的n是局部变量,不能外层函数引用

def createCounter():

    s=0

    defcounter():

        nonlocal s

        s+=1

        return s

    return counter



# -*- coding: utf-8 -*-




def createCounter():

    r=0

    def counter():

        nonlocal r  #重点  意思和楼上差不多,再白话一点就是楼下参数的不知道r=0,nonlocal的作用是标识该变量是上一级函数中的局部变量

                          #不知这样理解是不是是否全对(理解有错还请指出)

        r+=1

        return r

        

    return counter




# 测试:

counterA = createCounter()

print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5

counterB = createCounter()

if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:

    print('测试通过!')

这是因为python解释器无法确定你这个变量是全局变量还是局部变量,无法进行赋值运算,局部变量与全局变量同名了。我开始也是尝试这样用一个变量进行编写,发现报错。后来进行以下尝试,可以正常运行:

def createCounter2():

    global defsd

    defsd=0

    def counter():

        global defsd

        defsd+=1

        return defsd

    return counter

这样声明是全局变量以后,两个函数内都引用的是同一个变量defsd。

guang晕

#7 Created at ... [Delete] [Delete and Lock User]

为啥每次调用函数时list1不会被重新置为[0],而是递增下去,不应该每次调用函数list1在函数内部开头都会被重置吗

tycoonBrain

#8 Created at ... [Delete] [Delete and Lock User]

我觉得闭包,廖大这篇有些敷衍,把简单的复杂化了,建议大家搜搜其它关于闭包的文章,容易了解及运用.评论区看到很多答案都是有运用到nonlocal,和list达到可变,这也是其它文章所讲到的常用的解决方法.而廖大压根没提........

局部变量不能与全局变量同名,加一个Nonlocal告诉系统引入的是全局变量(我猜应该是这个道理


  • 1

Reply