Python作用域的问题
ringa_lee
ringa_lee 2017-04-17 17:31:38
0
2
291
class Node(object):
    def __init__(self, data=None, next_=None):
        self.next_ = next_
        self.data = data

class LinkList(object):
    def __init__(self):
        self.head = None
        self.tear = None
    def insert(self, node):
        if self.head is None:
            # print("is None")
            self.head = node
            self.tear = node
            self.head.next_ = self.tear
        else:
            # print("tear")
            self.tear.next_ = node
            self.tear = node
    def display(self):
        # global node
        node = self.head
        if node is not None:
            print(node.data)
            node = node.next_

为了便于理解我把整段代码都贴上来了.
这是用Python实现链表的插入功能

问题出在LinkList类中的display()函数
不把变量node设置为global的话,if语句下面node = node.next_这句 ,被赋值的node是一个新的变量(PyCharm提示Shadows name 'node' from outer scope和Local variable 'node' value is not used)

如果把if语句改为while循环,if和display函数下面的node就都为同一个变量

请问问题出在哪里 ?
Python版本是3.5

ringa_lee
ringa_lee

ringa_lee

répondre à tous(2)
伊谢尔伦

Portée des variables de Python :
Le module correspond au global,
La couche la plus interne est locale,
La couche externe est non locale
Ordre de recherche variable : Portée interne->Couche externe-&gt ; Global->builtin
Seules class, def et lamda changeront la portée

Lors de la lecture d'une variable, si local n'existe pas, recherchez nonlocal, puis global
Lors de l'écriture d'une variable, si nonlocal/global n'est pas spécifié, une nouvelle variable est définie dans la portée locale
Ce qui suit l'exemple est extrait du tutoriel python chapitre 9

def scope_test():
    def do_local():
        spam = "local spam"
    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"
    def do_global():
        global spam
        spam = "global spam"
    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)
PHPzhong

J'ai exécuté votre code dans l'interpréteur et PyCharm et je n'ai pas vu le problème que vous avez mentionné. Il est préférable de publier également le code exécuté. Je ne vois aucun problème rien qu'en les regardant.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal