В Питоне переменные передаются по ссылке или по значению? Есть подводные камни?
Неизменяемые объекты передаются по значению. Это значит, что при изменении значения переменной будет создан новый объект. К этому типу относятся:
- числовые данные (int, float, complex)
- символьные строки (str)
- кортежи (tuple) При инициализации переменной незменяемого типа создается объект (например, целое число), этот объект имеет некоторый идентификатор:
>>> a = 10 >>> id(a) 10914656
оператор = связывает переменную a и объект посредством ссылки. При этом вы не можете изменить сам объект, т.е. когда вы присвоите переменной новое значение, интерпретатор создаст новый объект (если до этого этот объект был создан, то переменная просто получит ссылку), а первоначальный объект удалится из памяти сбощиком мусора, если ссылок на него больше нет.
Изменяемые (mutable)
Изменяемые объекты передаются по ссылке. Это значит, что при изменении значения переменной объект будет изменен. К этому типу относятся:
- списки (list)
- множества (set)
- словари (dict)
Подводные камни
Создадим список a , установим для переменной b ссылку на a , прибавим к b элемент списка и выведем их значения и идентификаторы на экран:
>>> a = [1, 2] >>> b = a >>> b.append(3) >>> print(a, b) [1, 2, 3] [1, 2, 3] >>> print(id(a), id(b)) 139748057891656 139748057891656
Как мы видим, переменные имеют одинаковые id и элементы списка. Если ты не знаешь об этой особенности изменяемых объетов, то такое поведение программы для тебя становится полной неожиданностью и может привести к ошибке в работе программы. Таким же образом с помощью ссылки на изменяемый объект, переменная передается в функцию:
>>> def add_value(a): . a.append(3) >>> b = [1, 2] >>> add_value(b) >>> print(b) [1, 2, 3]
Даже возвращая None , функция изменила список b , чего бы нам не хотелось.
Что с этим можно сделать
Для того, чтобы передать в функцию изменяемую переменную как значение, нужно сделать копию изменяемого элемента. Создадим копию списка:
новый_лист = старый_лист[:]
Тоже самое можем сделать вот так:
новый_лист = list(старый_лист)
Переменная новый_лист ссылается на новый объект:
>>> id(старый_лист), id(новый_лист) (139748050279112, 139748057891656)
Это дает нам возможность изменять оба объекта независимо друг от друга.
Что почитать
- Переменные-ссылки в Python
- Understanding Python variables and Memory Management
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.
Python-сообщество
- Начало
- » Python для новичков
- » tkinter: переход по ссылке при нажатии на кнопку
#1 Дек. 1, 2014 15:28:48
YaYa Зарегистрирован: 2014-12-01 Сообщения: 3 Репутация: 0 Профиль Отправить e-mail
tkinter: переход по ссылке при нажатии на кнопку
Всем добрый вечер/день.
Идея следующая: создается что-то вроде мини-опросника — заголовок-вопрос и 4/5 кнопок-ответов. При нажатии на кнопку должен осуществляться переход по ссылке (ссылки фиксированные, не рандомные).
Создать кнопки я могу (т.е. при нажатии на кнопку ссылка таки открывается), а вот при нажатии на кнопку ругаются на меня:
Exception in Tkinter callback
Traceback (most recent call last):
File “C:\Python34\lib\tkinter\__init__.py”, line 1533, in __call__
return self.func(*args)
TypeError: invalid file:
Я очень (от слова “совсем”) новичок, подскажите, пожалуйста, в какую сторону необходимо читать.
p.s. да, понимаю, что за это мне еще рано было браться, надо на кошках тренироваться, но сделать очень хочется…
p.s. *превозмогая чувство стыда* вот оно:
[code python]from tkinter import *
class But:
def __init__(self):
self.but = Button(root)
self.but["text"] = "Первый вариант"
self.but.bind("", open)
self.but.pack()
def open(event):
import webbrowser
webbrowser.open("http://xkcd.ru/330/")
class But1:
def __init__(self):
self.but1 = Button(root)
self.but1["text"] = "Второй вариант"
self.but1.bind("", open)
self.but1.pack()
def open (event):
import webbrowser
webbrowser.open("http://xkcd.ru/1409/")
root = Tk()
obj = But()
obj = But1()
root.mainloop()[/code]

Здесь нет всего того о чем написано выше, но как добавить вопрос я еще натыкать кнопок я знаю
Парсер с переходом по ссылкам
Скрипт работает следующим образом: вы вводите ему URL-адрес, он просматривает на этой веб-странице количество имеющихся ссылок, следует по одной, снова просматривает эту новую веб-страницу, переходит по одной ссылке и так далее.
Как сделать что бы он перехрдил по всем ссылкам?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
from urllib.request import urlopen from urllib.parse import urljoin, urlsplit from bs4 import BeautifulSoup import time addr = input('enter an initial url: ') while True: html = BeautifulSoup(urlopen(addr).read(), 'html.parser') list_links = [] num = 0 for link in html.find_all('a'): url = link.get('href') if not urlsplit(url).netloc: url = urljoin(addr, url) if urlsplit(url).scheme in ['http', 'https']: print("%d : %s " % (num, str(url))) list_links.append(url) num += 1 idx = int(input("enter an index between 0 and %d: " % (len(list_links) - 1))) if not 0 idx len(list_links): raise ValueError('Number must be between 0 and %d: ' % len(list_links)) addr = list_links[idx] time.sleep(3)
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Работа с переходом по ссылкам в приложении
компилятор ошибок не выдает,но переходить по ссылке приложение не хочет. package.
Как заставить парсер переходить по ссылкам?
Парсер собирает данные с указанной страницы, как сделать так, чтобы он переходил по ссылкам на.
Проблемы с переходом с i3 на i5/i7
Всем добрый день. При смене процессора с i3-2100 на i5-3570k или i7-2600k (других не пробовал).
Проблемы с переходом
Может у кого была что то похожая. Проблема в следующем есть определеный код который должен.
Интерфейс с переходом
Здравствуйте,помогите пожалуйста доделать задание,цель какую нужно достичь описываю ниже: Сделал.
![]()
5890 / 3348 / 1034
Регистрация: 03.11.2009
Сообщений: 9,977
И не дай Бог там где-то ссылка на гугл — так и скачать интернет чего доброго можно, в Гугле много ссылок
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Проблема с переходом с 10 на 7
Доброе время суток! В двух словах, купил ноутбук в Греции THOMSON GRNEO15C Intel Celeron N3350 / 4.
Спойлер с переходом по ссылке
Всем привет. Не могу сообразить куда пихнуть a href чтобы при нажатии на кнопки спойлера он.
Проблемы с переходом на php 5.3
Всем привет)) Есть сайт, непонятно с какой CMS http://svadebniysite.ru/. Админка вызывается .
Проблемы с переходом на Office XP
Столкнулась со следующей проблемой По причине полной глючности и неуправляемости пришлось.

автокомплит с переходом на страницу
Здравствуйте! Нужно помощь с автокомплитом! Мне нужно что то вроде этого http://tripster.ru/. У.
Проблема с переходом на сцены
Здравствуйте, мне нужно, что бы из Сцены "Menu", по нажатию конпки "Play" — открывалась сцена.
Как открыть ссылку, а потом сохранить ответ с сайта в переменную Python?

Использую сервис для приема смс. Чтобы узнать баланс, используя Python, нужно перейти по ссылке, в которой содержится api ключ и команда, которая будет выполняться (в данном случае команда проверки баланса). После чего мне возвращается баланс на сайте в json формате. Выглядит так:
Больше ничего на странице нет. Можно ли как-то получить это значение сразу в переменную, без открытия браузера, без копирования html кода с сайта и вычленения баланса, и сохранить все в переменную?
Отслеживать
задан 5 авг 2021 в 9:53
584 3 3 серебряных знака 17 17 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Сохрани в переменную адрес. Через библиотеку requests выполни запрос по этому адресу (смотри про http-запросы).
Её нужно установить через пакетный менеджер: pip install requests .
import requests url = 'Тут твой адрес' response = requests.get(url) data = response.content
Полученный JSON распарсишь через стандартный json пакет в python:
import json result = json.loads(data)
Здесь data — это то, что ты получил из http-запроса. И уже из переменной result вытаскивай свой баланс
