a = 'hello'
b = None
c = None
for x in [a, b, c]:
    if isinstance(x, (basestring, dict, int, float)) or x is None:
        x = [x]
a

Zwraca "Hello", ale oczekiwano ['Hello']. Jednak to działa:

a = 'hello'
a = [a]
a

Zwraca ['Hello']

2
user7982442 28 czerwiec 2017, 06:05

3 odpowiedzi

Najlepsza odpowiedź

Aby to osiągnąć, najpierw musisz zrozumieć, że masz dwa różne odniesienia, A i X (dla każdego elementu), a odniesienie do listy [A, B, C], używany tylko w pętli do pętli i nigdy więcej.

Aby osiągnąć swój cel, możesz to zrobić:

a = 'hello'
b = None
c = None
lst = [a, b, c] #here I create a reference for a list containing the three references above
for i,x in enumerate(lst):
    if isinstance(x, (str,dict, int, float)) or x is None: #here I used str instead basestring
        lst[i] = [x]

print(lst[0]) #here I print the reference inside the list, that's why the value is now showed modified

['cześć']

Ale jak powiedziałem, jeśli drukujesz (a) pokaże się ponownie:

"Hello" #here Drukowałem wartość zmiennej A, której nie ma modyfikacji

Ponieważ nigdy nie zrobiłeś nic z tym.

Spójrz na to pytanie, aby zrozumieć trochę więcej o referencjach Jak mam przekazać zmienną przez odniesienie?

4
Damián Rafael Lattenero 28 czerwiec 2017, 03:26

Inne odpowiedzi są świetne. Myślę, że, aby uogólnić, element listy jest niezmienny / zmieszany, aby pętla w celu zwraca kopię, a nie odniesienie do oryginalnego obiektu. Powinienem był to zauważyć, ale uczy mnie za długo, bez snu!

Skończyło się na tym użyciu:

def lst(x):
    if isinstance(x, (basestring, dict, int, float)) or x is None:
        x = [x]
    return x
[a, b, c] = map(lst, [a, b, c])
0
bamboo77 28 czerwiec 2017, 03:49

Umożliwia pracować przez tę jedną linię na raz;

a = 'hello'  # assigns 'hello' to a.
b = None  # etc...
c = None
for x in [a, b, c]:  # Creates list from the values in 'a' 'b' and 'c', then iterates over them.
    # This if statement is always True. x is always either a string, or None.
    if isinstance(x, (basestring, dict, int, float)) or x is None:
        x = [x]  # On the first iteration, sets variable to the expected ['hello']
        # After that though - it replaces it with [None]
a  # = 'hello' - you have not assigned anything to the variable except on the first line.

Jedyną zmienną, która kiedykolwiek ustawiona na ['hello'] jest x, która szybko nadpisuje None. Jeśli zmieniłeś swój, aby wyłączyć or x is None i przypisany do a zamiast x otrzymasz pożądany wynik.

Warto również zauważyć, że lista [a, b, c] jest tworzona po uruchomieniu pętli. Zmiana a b lub c Podczas pętli nie będzie miało efektu - lista została już utworzona.

3
Shadow 28 czerwiec 2017, 03:15