Найти - Пользователи
Полная версия: Потерялся в namespace или обьектной матрице языка
Начало » Python для новичков » Потерялся в namespace или обьектной матрице языка
1
Alectaiactaest
Здравствуйте!
Первый мой вопрос на форуме. так что прошу не серчать если что не так

Итак на leetcode решал задачки про однонаправленные списки.
существует класс

 # Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

С ним различные манипуляции в задачке))

Задачку эту я решил, но наткнулся на одну необъяснимую штуку, надеюсь просветите.

 global b1
b1=ListNode(666)
 
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        def util(head,h1):
            b1.val=head.val  # присваиваю "глобальному" обьекту в поле val, функция возвращает 1
           
        util(head,head)
       
        return b1

но если



 global b1
b1=ListNode(666)
 
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        def util(head,h1):
            b1=head # присваиваю как обьект к обьекту- возвращает 666, то есть присваивания не происходит
           
        util(head,head)
       
        return b1


Почему не происходит присваиания во втором случае? на мой взгляд выражение допустимо

PxSx задачку решил изменив присваивание b1 на b1.next - аналогично первому примеру, но только с другим полем объекта.
FishHook
Alectaiactaest
global b1 надо писать внутри той функции в которой вы используете глобальную переменную, чтобы функция не создавала локальную переменную с таким же именем
Alectaiactaest
и как это отвечает на мой вопрос?
хотите сказать что образаясь к признаку .val новая переменная не создается?
а в чем смысл глобальности переменной если она создается новой внутри функции всёравно
Egorro13
Alectaiactaest
и как это отвечает на мой вопрос? хотите сказать что образаясь к признаку .val новая переменная не создается?а в чем смысл глобальности переменной если она создается новой внутри функции всёравно
b1.val - обращение к полю переменной, т.е. переменная в любом случае уже должна существовать. Если такой переменной нет в методе, ищется в классе, нет в классе - за его пределами и т.д.
b1=head - по умолчанию присваивается значение переменной метода, если она не существует - создается. global b1 выше этой строки, но в теле метода, означает, что b1 в этом методе ссылается на глобальную переменную, а не локальную. Сравни вывод с закомментированной и раскомментированной строкой:
 a = 123
def global_a():
    # global a
    a = 1000
    print(a, globals().get("a"))
global_a()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB