Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 30, 2019 19:10:31

Alectaiactaest
Зарегистрирован: 2019-06-30
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Потерялся в namespace или обьектной матрице языка

Здравствуйте!
Первый мой вопрос на форуме. так что прошу не серчать если что не так

Итак на 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 - аналогично первому примеру, но только с другим полем объекта.

Отредактировано Alectaiactaest (Июнь 30, 2019 19:38:30)

Офлайн

#2 Июнь 30, 2019 19:38:35

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Потерялся в namespace или обьектной матрице языка

Alectaiactaest
global b1 надо писать внутри той функции в которой вы используете глобальную переменную, чтобы функция не создавала локальную переменную с таким же именем



Офлайн

#3 Июнь 30, 2019 20:30:21

Alectaiactaest
Зарегистрирован: 2019-06-30
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Потерялся в namespace или обьектной матрице языка

и как это отвечает на мой вопрос?
хотите сказать что образаясь к признаку .val новая переменная не создается?
а в чем смысл глобальности переменной если она создается новой внутри функции всёравно

Офлайн

#4 Июнь 30, 2019 20:44:36

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

Потерялся в namespace или обьектной матрице языка

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()

Отредактировано Egorro13 (Июнь 30, 2019 20:44:54)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version