[#] Списки в функциях питона
Difrex(mira, 14) — All
2017-08-14 18:28:39


Зацените

import random


def get_port():
    port = random.randrange(33000, 37000, 1)
    return port


def check_list(port_list=[], count=0):
    if count == 0:
        print(port_list)

    port = get_port()

    if port in port_list:
        return "%s: %s in %s" % (count, port, len(port_list))
    else:
        count += 1
        port_list.append(port)
        return check_list(port_list, count)


print(check_list())
print(check_list())
print(check_list())

Наверное, для гуру питона поведение будет знакомо, но для меня такое поведение было полной неожиданностью :(

[#] Re: Списки в функциях питона
vit01(mira, 1) — Difrex
2017-08-14 20:29:15


Нихрена се. Интересное наблюдение.

Получается, после анализа кода интерпретатор создаёт пустой список [] и запоминает, где он лежит.

При вызове функции без параметров в дефолт-значения подставляется лишь указатель на этот самый список. И в последующие разы - тоже.

count всегда будет 0, потому что он примитив, а не полноценный объект, значит передаётся значением, а не по указателю

// В джаве у меня иногда встречались подобные путаницы. Там поведение такое же