Why can I use a list index as an indexing variable in a for loop? The 2019 Stack Overflow Developer Survey Results Are InHow do I check if a list is empty?Finding the index of an item given a list containing it in PythonAccessing the index in 'for' loops?Understanding Python super() with __init__() methodsHow do I sort a dictionary by value?How to make a flat list out of list of lists?How do I pass a variable by reference?Loop through an array in JavaScriptHow do I list all files of a directory?Why is printing “B” dramatically slower than printing “#”?
Dropping list elements from nested list after evaluation
Did Scotland spend $250,000 for the slogan "Welcome to Scotland"?
Does adding complexity mean a more secure cipher?
Match Roman Numerals
How do you keep chess fun when your opponent constantly beats you?
Why “相同意思的词” is called “同义词” instead of "同意词"?
Finding the area between two curves with Integrate
Accepted by European university, rejected by all American ones I applied to? Possible reasons?
How to quickly solve partial fractions equation?
Ubuntu Server install with full GUI
Can an undergraduate be advised by a professor who is very far away?
Is bread bad for ducks?
Mathematics of imaging the black hole
Did any laptop computers have a built-in 5 1/4 inch floppy drive?
Short story: man watches girlfriend's spaceship entering a 'black hole' (?) forever
writing variables above the numbers in tikz picture
What could be the right powersource for 15 seconds lifespan disposable giant chainsaw?
Can we generate random numbers using irrational numbers like π and e?
Cooking pasta in a water boiler
Is it ethical to upload a automatically generated paper to a non peer-reviewed site as part of a larger research?
How come people say “Would of”?
How to support a colleague who finds meetings extremely tiring?
Will it cause any balance problems to have PCs level up and gain the benefits of a long rest mid-fight?
Is Cinnamon a desktop environment or a window manager? (Or both?)
Why can I use a list index as an indexing variable in a for loop?
The 2019 Stack Overflow Developer Survey Results Are InHow do I check if a list is empty?Finding the index of an item given a list containing it in PythonAccessing the index in 'for' loops?Understanding Python super() with __init__() methodsHow do I sort a dictionary by value?How to make a flat list out of list of lists?How do I pass a variable by reference?Loop through an array in JavaScriptHow do I list all files of a directory?Why is printing “B” dramatically slower than printing “#”?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
I have the following code:
a = [0,1,2,3]
for a[-1] in a:
print(a[-1])
The output is:
0
1
2
2
I'm confused about why a list index can be used as an indexing variable in a for a loop?
python for-loop
New contributor
|
show 2 more comments
I have the following code:
a = [0,1,2,3]
for a[-1] in a:
print(a[-1])
The output is:
0
1
2
2
I'm confused about why a list index can be used as an indexing variable in a for a loop?
python for-loop
New contributor
7
Somehow this question looks like a bad and newbie question, but I don't get the logic either lol
– gameon67
56 mins ago
4
I don't know why you would ever want to do this, but now I know you can
– Nathan
54 mins ago
over the iteration only the last time a[-1] gets its value, all other times python treats as iteration variable.
– Arun Augustine
50 mins ago
7
This would be a great question for an awful coding interview
– Nathan
47 mins ago
1
OP, since it seems like your post may be gaining some traffic, I edited your post in an attempt to make your question clearer. If I'm misinterpreting your question, you can rollback the edit.
– Christian Dean
26 mins ago
|
show 2 more comments
I have the following code:
a = [0,1,2,3]
for a[-1] in a:
print(a[-1])
The output is:
0
1
2
2
I'm confused about why a list index can be used as an indexing variable in a for a loop?
python for-loop
New contributor
I have the following code:
a = [0,1,2,3]
for a[-1] in a:
print(a[-1])
The output is:
0
1
2
2
I'm confused about why a list index can be used as an indexing variable in a for a loop?
python for-loop
python for-loop
New contributor
New contributor
edited 18 mins ago
Amir A. Shabani
457616
457616
New contributor
asked 1 hour ago
Kundan VermaKundan Verma
712
712
New contributor
New contributor
7
Somehow this question looks like a bad and newbie question, but I don't get the logic either lol
– gameon67
56 mins ago
4
I don't know why you would ever want to do this, but now I know you can
– Nathan
54 mins ago
over the iteration only the last time a[-1] gets its value, all other times python treats as iteration variable.
– Arun Augustine
50 mins ago
7
This would be a great question for an awful coding interview
– Nathan
47 mins ago
1
OP, since it seems like your post may be gaining some traffic, I edited your post in an attempt to make your question clearer. If I'm misinterpreting your question, you can rollback the edit.
– Christian Dean
26 mins ago
|
show 2 more comments
7
Somehow this question looks like a bad and newbie question, but I don't get the logic either lol
– gameon67
56 mins ago
4
I don't know why you would ever want to do this, but now I know you can
– Nathan
54 mins ago
over the iteration only the last time a[-1] gets its value, all other times python treats as iteration variable.
– Arun Augustine
50 mins ago
7
This would be a great question for an awful coding interview
– Nathan
47 mins ago
1
OP, since it seems like your post may be gaining some traffic, I edited your post in an attempt to make your question clearer. If I'm misinterpreting your question, you can rollback the edit.
– Christian Dean
26 mins ago
7
7
Somehow this question looks like a bad and newbie question, but I don't get the logic either lol
– gameon67
56 mins ago
Somehow this question looks like a bad and newbie question, but I don't get the logic either lol
– gameon67
56 mins ago
4
4
I don't know why you would ever want to do this, but now I know you can
– Nathan
54 mins ago
I don't know why you would ever want to do this, but now I know you can
– Nathan
54 mins ago
over the iteration only the last time a[-1] gets its value, all other times python treats as iteration variable.
– Arun Augustine
50 mins ago
over the iteration only the last time a[-1] gets its value, all other times python treats as iteration variable.
– Arun Augustine
50 mins ago
7
7
This would be a great question for an awful coding interview
– Nathan
47 mins ago
This would be a great question for an awful coding interview
– Nathan
47 mins ago
1
1
OP, since it seems like your post may be gaining some traffic, I edited your post in an attempt to make your question clearer. If I'm misinterpreting your question, you can rollback the edit.
– Christian Dean
26 mins ago
OP, since it seems like your post may be gaining some traffic, I edited your post in an attempt to make your question clearer. If I'm misinterpreting your question, you can rollback the edit.
– Christian Dean
26 mins ago
|
show 2 more comments
5 Answers
5
active
oldest
votes
To bring a language-lawyer aspect to the question, let's look at documentation:
for_stmt ::= "for" target_list "in" expression_list ":" suite
The expression list is evaluated once; it should yield an iterable object. An iterator is created for the result of the
expression_list
. The suite is then executed once for each item provided by the iterator, in the order returned by the iterator. Each item in turn is assigned to the target list using the standard rules for assignments (see Assignment statements), and then the suite is executed.
(emphasis not originally in docs)
The suite refers to the statements under the for-block. print(a[-1])
in OP's example.
Simply, on each iteration, the loop variable (target_list
) gets assigned to the next item in the iterable (expression_list
).
Let's extend the print statement:
a = [0, 1, 2, 3]
for a[-1] in a:
print(a, a[-1])
This gives the following output:
[0, 1, 2, 0] 0 # a[-1] assigned 0
[0, 1, 2, 1] 1 # a[-1] assigned 1
[0, 1, 2, 2] 2 # a[-1] assigned 2
[0, 1, 2, 2] 2 # a[-1] assigned itself (2)
As a[-1]
is a valid form left-hand side, assignments to a[-1]
will mutate a
, modifying the list during iteration. In this particular example, a[-1]
retains -2
from the previous evaluation. If we trace the assignment on each iteration, we have
a[-1] = 0 # a[0] # a[3] is 0 now
a[-1] = 1 # a[1] # a[3] is 1 now
a[-1] = 2 # a[2] # a[3] is 2 now
a[-1] = 2 # a[3] # a[3] is itself (2)
2
Might be useful to bold Each item [...] is assigned to the target list using the standard rules for assignments.
– Mateen Ulhaq
42 mins ago
2
Essentially, the important thing to note here is that Python considersa[-1]
to be a valid form of the left-hand side of an assignment statement (e.g.a[-1] = 1
is valid grammar). Thusa[-1]
is a valid "variable" name, because as the documentation stated, it evaluates the binding variable(s) in a for loop declaration as it would the left-hand side of an assignment.
– Christian Dean
30 mins ago
add a comment |
it is an interesting question, you can understand it by that:
for v in a:
a[-1] = v
print(a[-1])
print(a)
actually a
becomes: [0, 1, 2, 2]
after loop
output:
0
1
2
2
[0, 1, 2, 2]
Hope that helps you, and comment if you have further questions. : )
add a comment |
(this is more of a long comment than an answer - there are a couple of good ones already, especially @TrebledJ's. But I had to think of it explicitly in terms of overwriting variables that already have values before it clicked for me.)
If you had
x = 0
l = [1, 2, 3]
for x in l:
print(x)
you wouldn't be surprised that x
is overriden each time through the loop. Even though x
existed before, its value isn't used (i.e. for 0 in l:
, which would throw an error). Rather, we assign the values from l
to x
.
When we do
a = [0, 1, 2, 3]
for a[-1] in a:
print(a[-1])
even though a[-1]
already exists and has a value, we don't put that value in but rather assign to a[-1]
each time through the loop.
Somehow I thought the variable used infor loop
is immutable. +1 for pointing it out.
– Amir A. Shabani
34 mins ago
add a comment |
The left expression of a for
loop statement gets assigned with each item in the iterable on the right in each iteration, so
for n in a:
print(n)
is just a fancy way of doing:
for i in range(len(a)):
n = a[i]
print(n)
Likewise,
for a[-1] in a:
print(a[-1])
is just a fancy way of doing:
for i in range(len(a)):
a[-1] = a[i]
print(a[-1])
where in each iteration, the last item of a
gets assigned with the next item in a
, so when the iteration finally comes to the last item, its value got last assigned with the second-last item, 2
.
add a comment |
a[-1]
refers to the last element of a
, in this case a[3]
. The for
loop is a bit unusual in that it is using this element as the loop variable.
It's not evaluating that element upon loop entry, but rather it is assigning to it on each iteration through the loop.
So first a[-1]
gets set to 0, then 1, then 2. Finally, on the last iteration, the for
loop retrieves a[3]
which at that point is 2
, so the list ends up as [0, 1, 2, 2]
.
A more typical for
loop uses a simple local variable name as the loop variable, e.g. for x ...
. In that case, x
is set to the next value upon each iteration. This case is no different, except that a[-1]
is set to the next value upon each iteration. You don't see this very often, but it's consistent.
How does it actuallygets set to 0, then 1, then 2 and finally 2
? That's the confusing part!
– Amir A. Shabani
58 mins ago
1
Agree, I don't really understand by reading this answer
– gameon67
58 mins ago
I expected it would be like sayingfor 3 in a: print(a[-1])
(becausea[-1]
was3
at the start of the loop) and give an error, but clearly that's not the case. You're obviously correct about what's happening, but I'm surprised this evaluates this way.
– Nathan
55 mins ago
It's set by thefor
loop. Each time through, it gets set to the next element of the list. What's the first element? Right, it's 0. What's the second? Right again, it's 1. etc.
– Tom Karzes
55 mins ago
1
"The for loop is a bit unusual in that it is using this element as the loop variable." - This may be where the confusion is coming from. Python isn't using the elementa[-1]
evaluates to, rather, it's using the indexa[-1]
itself. If you rephrase that statement, your answer becomes much more clear.
– Christian Dean
22 mins ago
|
show 3 more comments
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Kundan Verma is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55644201%2fwhy-can-i-use-a-list-index-as-an-indexing-variable-in-a-for-loop%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
5 Answers
5
active
oldest
votes
5 Answers
5
active
oldest
votes
active
oldest
votes
active
oldest
votes
To bring a language-lawyer aspect to the question, let's look at documentation:
for_stmt ::= "for" target_list "in" expression_list ":" suite
The expression list is evaluated once; it should yield an iterable object. An iterator is created for the result of the
expression_list
. The suite is then executed once for each item provided by the iterator, in the order returned by the iterator. Each item in turn is assigned to the target list using the standard rules for assignments (see Assignment statements), and then the suite is executed.
(emphasis not originally in docs)
The suite refers to the statements under the for-block. print(a[-1])
in OP's example.
Simply, on each iteration, the loop variable (target_list
) gets assigned to the next item in the iterable (expression_list
).
Let's extend the print statement:
a = [0, 1, 2, 3]
for a[-1] in a:
print(a, a[-1])
This gives the following output:
[0, 1, 2, 0] 0 # a[-1] assigned 0
[0, 1, 2, 1] 1 # a[-1] assigned 1
[0, 1, 2, 2] 2 # a[-1] assigned 2
[0, 1, 2, 2] 2 # a[-1] assigned itself (2)
As a[-1]
is a valid form left-hand side, assignments to a[-1]
will mutate a
, modifying the list during iteration. In this particular example, a[-1]
retains -2
from the previous evaluation. If we trace the assignment on each iteration, we have
a[-1] = 0 # a[0] # a[3] is 0 now
a[-1] = 1 # a[1] # a[3] is 1 now
a[-1] = 2 # a[2] # a[3] is 2 now
a[-1] = 2 # a[3] # a[3] is itself (2)
2
Might be useful to bold Each item [...] is assigned to the target list using the standard rules for assignments.
– Mateen Ulhaq
42 mins ago
2
Essentially, the important thing to note here is that Python considersa[-1]
to be a valid form of the left-hand side of an assignment statement (e.g.a[-1] = 1
is valid grammar). Thusa[-1]
is a valid "variable" name, because as the documentation stated, it evaluates the binding variable(s) in a for loop declaration as it would the left-hand side of an assignment.
– Christian Dean
30 mins ago
add a comment |
To bring a language-lawyer aspect to the question, let's look at documentation:
for_stmt ::= "for" target_list "in" expression_list ":" suite
The expression list is evaluated once; it should yield an iterable object. An iterator is created for the result of the
expression_list
. The suite is then executed once for each item provided by the iterator, in the order returned by the iterator. Each item in turn is assigned to the target list using the standard rules for assignments (see Assignment statements), and then the suite is executed.
(emphasis not originally in docs)
The suite refers to the statements under the for-block. print(a[-1])
in OP's example.
Simply, on each iteration, the loop variable (target_list
) gets assigned to the next item in the iterable (expression_list
).
Let's extend the print statement:
a = [0, 1, 2, 3]
for a[-1] in a:
print(a, a[-1])
This gives the following output:
[0, 1, 2, 0] 0 # a[-1] assigned 0
[0, 1, 2, 1] 1 # a[-1] assigned 1
[0, 1, 2, 2] 2 # a[-1] assigned 2
[0, 1, 2, 2] 2 # a[-1] assigned itself (2)
As a[-1]
is a valid form left-hand side, assignments to a[-1]
will mutate a
, modifying the list during iteration. In this particular example, a[-1]
retains -2
from the previous evaluation. If we trace the assignment on each iteration, we have
a[-1] = 0 # a[0] # a[3] is 0 now
a[-1] = 1 # a[1] # a[3] is 1 now
a[-1] = 2 # a[2] # a[3] is 2 now
a[-1] = 2 # a[3] # a[3] is itself (2)
2
Might be useful to bold Each item [...] is assigned to the target list using the standard rules for assignments.
– Mateen Ulhaq
42 mins ago
2
Essentially, the important thing to note here is that Python considersa[-1]
to be a valid form of the left-hand side of an assignment statement (e.g.a[-1] = 1
is valid grammar). Thusa[-1]
is a valid "variable" name, because as the documentation stated, it evaluates the binding variable(s) in a for loop declaration as it would the left-hand side of an assignment.
– Christian Dean
30 mins ago
add a comment |
To bring a language-lawyer aspect to the question, let's look at documentation:
for_stmt ::= "for" target_list "in" expression_list ":" suite
The expression list is evaluated once; it should yield an iterable object. An iterator is created for the result of the
expression_list
. The suite is then executed once for each item provided by the iterator, in the order returned by the iterator. Each item in turn is assigned to the target list using the standard rules for assignments (see Assignment statements), and then the suite is executed.
(emphasis not originally in docs)
The suite refers to the statements under the for-block. print(a[-1])
in OP's example.
Simply, on each iteration, the loop variable (target_list
) gets assigned to the next item in the iterable (expression_list
).
Let's extend the print statement:
a = [0, 1, 2, 3]
for a[-1] in a:
print(a, a[-1])
This gives the following output:
[0, 1, 2, 0] 0 # a[-1] assigned 0
[0, 1, 2, 1] 1 # a[-1] assigned 1
[0, 1, 2, 2] 2 # a[-1] assigned 2
[0, 1, 2, 2] 2 # a[-1] assigned itself (2)
As a[-1]
is a valid form left-hand side, assignments to a[-1]
will mutate a
, modifying the list during iteration. In this particular example, a[-1]
retains -2
from the previous evaluation. If we trace the assignment on each iteration, we have
a[-1] = 0 # a[0] # a[3] is 0 now
a[-1] = 1 # a[1] # a[3] is 1 now
a[-1] = 2 # a[2] # a[3] is 2 now
a[-1] = 2 # a[3] # a[3] is itself (2)
To bring a language-lawyer aspect to the question, let's look at documentation:
for_stmt ::= "for" target_list "in" expression_list ":" suite
The expression list is evaluated once; it should yield an iterable object. An iterator is created for the result of the
expression_list
. The suite is then executed once for each item provided by the iterator, in the order returned by the iterator. Each item in turn is assigned to the target list using the standard rules for assignments (see Assignment statements), and then the suite is executed.
(emphasis not originally in docs)
The suite refers to the statements under the for-block. print(a[-1])
in OP's example.
Simply, on each iteration, the loop variable (target_list
) gets assigned to the next item in the iterable (expression_list
).
Let's extend the print statement:
a = [0, 1, 2, 3]
for a[-1] in a:
print(a, a[-1])
This gives the following output:
[0, 1, 2, 0] 0 # a[-1] assigned 0
[0, 1, 2, 1] 1 # a[-1] assigned 1
[0, 1, 2, 2] 2 # a[-1] assigned 2
[0, 1, 2, 2] 2 # a[-1] assigned itself (2)
As a[-1]
is a valid form left-hand side, assignments to a[-1]
will mutate a
, modifying the list during iteration. In this particular example, a[-1]
retains -2
from the previous evaluation. If we trace the assignment on each iteration, we have
a[-1] = 0 # a[0] # a[3] is 0 now
a[-1] = 1 # a[1] # a[3] is 1 now
a[-1] = 2 # a[2] # a[3] is 2 now
a[-1] = 2 # a[3] # a[3] is itself (2)
edited 27 mins ago
answered 46 mins ago
TrebledJTrebledJ
3,75421328
3,75421328
2
Might be useful to bold Each item [...] is assigned to the target list using the standard rules for assignments.
– Mateen Ulhaq
42 mins ago
2
Essentially, the important thing to note here is that Python considersa[-1]
to be a valid form of the left-hand side of an assignment statement (e.g.a[-1] = 1
is valid grammar). Thusa[-1]
is a valid "variable" name, because as the documentation stated, it evaluates the binding variable(s) in a for loop declaration as it would the left-hand side of an assignment.
– Christian Dean
30 mins ago
add a comment |
2
Might be useful to bold Each item [...] is assigned to the target list using the standard rules for assignments.
– Mateen Ulhaq
42 mins ago
2
Essentially, the important thing to note here is that Python considersa[-1]
to be a valid form of the left-hand side of an assignment statement (e.g.a[-1] = 1
is valid grammar). Thusa[-1]
is a valid "variable" name, because as the documentation stated, it evaluates the binding variable(s) in a for loop declaration as it would the left-hand side of an assignment.
– Christian Dean
30 mins ago
2
2
Might be useful to bold Each item [...] is assigned to the target list using the standard rules for assignments.
– Mateen Ulhaq
42 mins ago
Might be useful to bold Each item [...] is assigned to the target list using the standard rules for assignments.
– Mateen Ulhaq
42 mins ago
2
2
Essentially, the important thing to note here is that Python considers
a[-1]
to be a valid form of the left-hand side of an assignment statement (e.g. a[-1] = 1
is valid grammar). Thus a[-1]
is a valid "variable" name, because as the documentation stated, it evaluates the binding variable(s) in a for loop declaration as it would the left-hand side of an assignment.– Christian Dean
30 mins ago
Essentially, the important thing to note here is that Python considers
a[-1]
to be a valid form of the left-hand side of an assignment statement (e.g. a[-1] = 1
is valid grammar). Thus a[-1]
is a valid "variable" name, because as the documentation stated, it evaluates the binding variable(s) in a for loop declaration as it would the left-hand side of an assignment.– Christian Dean
30 mins ago
add a comment |
it is an interesting question, you can understand it by that:
for v in a:
a[-1] = v
print(a[-1])
print(a)
actually a
becomes: [0, 1, 2, 2]
after loop
output:
0
1
2
2
[0, 1, 2, 2]
Hope that helps you, and comment if you have further questions. : )
add a comment |
it is an interesting question, you can understand it by that:
for v in a:
a[-1] = v
print(a[-1])
print(a)
actually a
becomes: [0, 1, 2, 2]
after loop
output:
0
1
2
2
[0, 1, 2, 2]
Hope that helps you, and comment if you have further questions. : )
add a comment |
it is an interesting question, you can understand it by that:
for v in a:
a[-1] = v
print(a[-1])
print(a)
actually a
becomes: [0, 1, 2, 2]
after loop
output:
0
1
2
2
[0, 1, 2, 2]
Hope that helps you, and comment if you have further questions. : )
it is an interesting question, you can understand it by that:
for v in a:
a[-1] = v
print(a[-1])
print(a)
actually a
becomes: [0, 1, 2, 2]
after loop
output:
0
1
2
2
[0, 1, 2, 2]
Hope that helps you, and comment if you have further questions. : )
answered 48 mins ago
recnacrecnac
1,193123
1,193123
add a comment |
add a comment |
(this is more of a long comment than an answer - there are a couple of good ones already, especially @TrebledJ's. But I had to think of it explicitly in terms of overwriting variables that already have values before it clicked for me.)
If you had
x = 0
l = [1, 2, 3]
for x in l:
print(x)
you wouldn't be surprised that x
is overriden each time through the loop. Even though x
existed before, its value isn't used (i.e. for 0 in l:
, which would throw an error). Rather, we assign the values from l
to x
.
When we do
a = [0, 1, 2, 3]
for a[-1] in a:
print(a[-1])
even though a[-1]
already exists and has a value, we don't put that value in but rather assign to a[-1]
each time through the loop.
Somehow I thought the variable used infor loop
is immutable. +1 for pointing it out.
– Amir A. Shabani
34 mins ago
add a comment |
(this is more of a long comment than an answer - there are a couple of good ones already, especially @TrebledJ's. But I had to think of it explicitly in terms of overwriting variables that already have values before it clicked for me.)
If you had
x = 0
l = [1, 2, 3]
for x in l:
print(x)
you wouldn't be surprised that x
is overriden each time through the loop. Even though x
existed before, its value isn't used (i.e. for 0 in l:
, which would throw an error). Rather, we assign the values from l
to x
.
When we do
a = [0, 1, 2, 3]
for a[-1] in a:
print(a[-1])
even though a[-1]
already exists and has a value, we don't put that value in but rather assign to a[-1]
each time through the loop.
Somehow I thought the variable used infor loop
is immutable. +1 for pointing it out.
– Amir A. Shabani
34 mins ago
add a comment |
(this is more of a long comment than an answer - there are a couple of good ones already, especially @TrebledJ's. But I had to think of it explicitly in terms of overwriting variables that already have values before it clicked for me.)
If you had
x = 0
l = [1, 2, 3]
for x in l:
print(x)
you wouldn't be surprised that x
is overriden each time through the loop. Even though x
existed before, its value isn't used (i.e. for 0 in l:
, which would throw an error). Rather, we assign the values from l
to x
.
When we do
a = [0, 1, 2, 3]
for a[-1] in a:
print(a[-1])
even though a[-1]
already exists and has a value, we don't put that value in but rather assign to a[-1]
each time through the loop.
(this is more of a long comment than an answer - there are a couple of good ones already, especially @TrebledJ's. But I had to think of it explicitly in terms of overwriting variables that already have values before it clicked for me.)
If you had
x = 0
l = [1, 2, 3]
for x in l:
print(x)
you wouldn't be surprised that x
is overriden each time through the loop. Even though x
existed before, its value isn't used (i.e. for 0 in l:
, which would throw an error). Rather, we assign the values from l
to x
.
When we do
a = [0, 1, 2, 3]
for a[-1] in a:
print(a[-1])
even though a[-1]
already exists and has a value, we don't put that value in but rather assign to a[-1]
each time through the loop.
edited 30 mins ago
Amir A. Shabani
457616
457616
answered 37 mins ago
NathanNathan
2,02511326
2,02511326
Somehow I thought the variable used infor loop
is immutable. +1 for pointing it out.
– Amir A. Shabani
34 mins ago
add a comment |
Somehow I thought the variable used infor loop
is immutable. +1 for pointing it out.
– Amir A. Shabani
34 mins ago
Somehow I thought the variable used in
for loop
is immutable. +1 for pointing it out.– Amir A. Shabani
34 mins ago
Somehow I thought the variable used in
for loop
is immutable. +1 for pointing it out.– Amir A. Shabani
34 mins ago
add a comment |
The left expression of a for
loop statement gets assigned with each item in the iterable on the right in each iteration, so
for n in a:
print(n)
is just a fancy way of doing:
for i in range(len(a)):
n = a[i]
print(n)
Likewise,
for a[-1] in a:
print(a[-1])
is just a fancy way of doing:
for i in range(len(a)):
a[-1] = a[i]
print(a[-1])
where in each iteration, the last item of a
gets assigned with the next item in a
, so when the iteration finally comes to the last item, its value got last assigned with the second-last item, 2
.
add a comment |
The left expression of a for
loop statement gets assigned with each item in the iterable on the right in each iteration, so
for n in a:
print(n)
is just a fancy way of doing:
for i in range(len(a)):
n = a[i]
print(n)
Likewise,
for a[-1] in a:
print(a[-1])
is just a fancy way of doing:
for i in range(len(a)):
a[-1] = a[i]
print(a[-1])
where in each iteration, the last item of a
gets assigned with the next item in a
, so when the iteration finally comes to the last item, its value got last assigned with the second-last item, 2
.
add a comment |
The left expression of a for
loop statement gets assigned with each item in the iterable on the right in each iteration, so
for n in a:
print(n)
is just a fancy way of doing:
for i in range(len(a)):
n = a[i]
print(n)
Likewise,
for a[-1] in a:
print(a[-1])
is just a fancy way of doing:
for i in range(len(a)):
a[-1] = a[i]
print(a[-1])
where in each iteration, the last item of a
gets assigned with the next item in a
, so when the iteration finally comes to the last item, its value got last assigned with the second-last item, 2
.
The left expression of a for
loop statement gets assigned with each item in the iterable on the right in each iteration, so
for n in a:
print(n)
is just a fancy way of doing:
for i in range(len(a)):
n = a[i]
print(n)
Likewise,
for a[-1] in a:
print(a[-1])
is just a fancy way of doing:
for i in range(len(a)):
a[-1] = a[i]
print(a[-1])
where in each iteration, the last item of a
gets assigned with the next item in a
, so when the iteration finally comes to the last item, its value got last assigned with the second-last item, 2
.
answered 43 mins ago
blhsingblhsing
43.5k41744
43.5k41744
add a comment |
add a comment |
a[-1]
refers to the last element of a
, in this case a[3]
. The for
loop is a bit unusual in that it is using this element as the loop variable.
It's not evaluating that element upon loop entry, but rather it is assigning to it on each iteration through the loop.
So first a[-1]
gets set to 0, then 1, then 2. Finally, on the last iteration, the for
loop retrieves a[3]
which at that point is 2
, so the list ends up as [0, 1, 2, 2]
.
A more typical for
loop uses a simple local variable name as the loop variable, e.g. for x ...
. In that case, x
is set to the next value upon each iteration. This case is no different, except that a[-1]
is set to the next value upon each iteration. You don't see this very often, but it's consistent.
How does it actuallygets set to 0, then 1, then 2 and finally 2
? That's the confusing part!
– Amir A. Shabani
58 mins ago
1
Agree, I don't really understand by reading this answer
– gameon67
58 mins ago
I expected it would be like sayingfor 3 in a: print(a[-1])
(becausea[-1]
was3
at the start of the loop) and give an error, but clearly that's not the case. You're obviously correct about what's happening, but I'm surprised this evaluates this way.
– Nathan
55 mins ago
It's set by thefor
loop. Each time through, it gets set to the next element of the list. What's the first element? Right, it's 0. What's the second? Right again, it's 1. etc.
– Tom Karzes
55 mins ago
1
"The for loop is a bit unusual in that it is using this element as the loop variable." - This may be where the confusion is coming from. Python isn't using the elementa[-1]
evaluates to, rather, it's using the indexa[-1]
itself. If you rephrase that statement, your answer becomes much more clear.
– Christian Dean
22 mins ago
|
show 3 more comments
a[-1]
refers to the last element of a
, in this case a[3]
. The for
loop is a bit unusual in that it is using this element as the loop variable.
It's not evaluating that element upon loop entry, but rather it is assigning to it on each iteration through the loop.
So first a[-1]
gets set to 0, then 1, then 2. Finally, on the last iteration, the for
loop retrieves a[3]
which at that point is 2
, so the list ends up as [0, 1, 2, 2]
.
A more typical for
loop uses a simple local variable name as the loop variable, e.g. for x ...
. In that case, x
is set to the next value upon each iteration. This case is no different, except that a[-1]
is set to the next value upon each iteration. You don't see this very often, but it's consistent.
How does it actuallygets set to 0, then 1, then 2 and finally 2
? That's the confusing part!
– Amir A. Shabani
58 mins ago
1
Agree, I don't really understand by reading this answer
– gameon67
58 mins ago
I expected it would be like sayingfor 3 in a: print(a[-1])
(becausea[-1]
was3
at the start of the loop) and give an error, but clearly that's not the case. You're obviously correct about what's happening, but I'm surprised this evaluates this way.
– Nathan
55 mins ago
It's set by thefor
loop. Each time through, it gets set to the next element of the list. What's the first element? Right, it's 0. What's the second? Right again, it's 1. etc.
– Tom Karzes
55 mins ago
1
"The for loop is a bit unusual in that it is using this element as the loop variable." - This may be where the confusion is coming from. Python isn't using the elementa[-1]
evaluates to, rather, it's using the indexa[-1]
itself. If you rephrase that statement, your answer becomes much more clear.
– Christian Dean
22 mins ago
|
show 3 more comments
a[-1]
refers to the last element of a
, in this case a[3]
. The for
loop is a bit unusual in that it is using this element as the loop variable.
It's not evaluating that element upon loop entry, but rather it is assigning to it on each iteration through the loop.
So first a[-1]
gets set to 0, then 1, then 2. Finally, on the last iteration, the for
loop retrieves a[3]
which at that point is 2
, so the list ends up as [0, 1, 2, 2]
.
A more typical for
loop uses a simple local variable name as the loop variable, e.g. for x ...
. In that case, x
is set to the next value upon each iteration. This case is no different, except that a[-1]
is set to the next value upon each iteration. You don't see this very often, but it's consistent.
a[-1]
refers to the last element of a
, in this case a[3]
. The for
loop is a bit unusual in that it is using this element as the loop variable.
It's not evaluating that element upon loop entry, but rather it is assigning to it on each iteration through the loop.
So first a[-1]
gets set to 0, then 1, then 2. Finally, on the last iteration, the for
loop retrieves a[3]
which at that point is 2
, so the list ends up as [0, 1, 2, 2]
.
A more typical for
loop uses a simple local variable name as the loop variable, e.g. for x ...
. In that case, x
is set to the next value upon each iteration. This case is no different, except that a[-1]
is set to the next value upon each iteration. You don't see this very often, but it's consistent.
edited 4 mins ago
answered 1 hour ago
Tom KarzesTom Karzes
11.2k1926
11.2k1926
How does it actuallygets set to 0, then 1, then 2 and finally 2
? That's the confusing part!
– Amir A. Shabani
58 mins ago
1
Agree, I don't really understand by reading this answer
– gameon67
58 mins ago
I expected it would be like sayingfor 3 in a: print(a[-1])
(becausea[-1]
was3
at the start of the loop) and give an error, but clearly that's not the case. You're obviously correct about what's happening, but I'm surprised this evaluates this way.
– Nathan
55 mins ago
It's set by thefor
loop. Each time through, it gets set to the next element of the list. What's the first element? Right, it's 0. What's the second? Right again, it's 1. etc.
– Tom Karzes
55 mins ago
1
"The for loop is a bit unusual in that it is using this element as the loop variable." - This may be where the confusion is coming from. Python isn't using the elementa[-1]
evaluates to, rather, it's using the indexa[-1]
itself. If you rephrase that statement, your answer becomes much more clear.
– Christian Dean
22 mins ago
|
show 3 more comments
How does it actuallygets set to 0, then 1, then 2 and finally 2
? That's the confusing part!
– Amir A. Shabani
58 mins ago
1
Agree, I don't really understand by reading this answer
– gameon67
58 mins ago
I expected it would be like sayingfor 3 in a: print(a[-1])
(becausea[-1]
was3
at the start of the loop) and give an error, but clearly that's not the case. You're obviously correct about what's happening, but I'm surprised this evaluates this way.
– Nathan
55 mins ago
It's set by thefor
loop. Each time through, it gets set to the next element of the list. What's the first element? Right, it's 0. What's the second? Right again, it's 1. etc.
– Tom Karzes
55 mins ago
1
"The for loop is a bit unusual in that it is using this element as the loop variable." - This may be where the confusion is coming from. Python isn't using the elementa[-1]
evaluates to, rather, it's using the indexa[-1]
itself. If you rephrase that statement, your answer becomes much more clear.
– Christian Dean
22 mins ago
How does it actually
gets set to 0, then 1, then 2 and finally 2
? That's the confusing part!– Amir A. Shabani
58 mins ago
How does it actually
gets set to 0, then 1, then 2 and finally 2
? That's the confusing part!– Amir A. Shabani
58 mins ago
1
1
Agree, I don't really understand by reading this answer
– gameon67
58 mins ago
Agree, I don't really understand by reading this answer
– gameon67
58 mins ago
I expected it would be like saying
for 3 in a: print(a[-1])
(because a[-1]
was 3
at the start of the loop) and give an error, but clearly that's not the case. You're obviously correct about what's happening, but I'm surprised this evaluates this way.– Nathan
55 mins ago
I expected it would be like saying
for 3 in a: print(a[-1])
(because a[-1]
was 3
at the start of the loop) and give an error, but clearly that's not the case. You're obviously correct about what's happening, but I'm surprised this evaluates this way.– Nathan
55 mins ago
It's set by the
for
loop. Each time through, it gets set to the next element of the list. What's the first element? Right, it's 0. What's the second? Right again, it's 1. etc.– Tom Karzes
55 mins ago
It's set by the
for
loop. Each time through, it gets set to the next element of the list. What's the first element? Right, it's 0. What's the second? Right again, it's 1. etc.– Tom Karzes
55 mins ago
1
1
"The for loop is a bit unusual in that it is using this element as the loop variable." - This may be where the confusion is coming from. Python isn't using the element
a[-1]
evaluates to, rather, it's using the index a[-1]
itself. If you rephrase that statement, your answer becomes much more clear.– Christian Dean
22 mins ago
"The for loop is a bit unusual in that it is using this element as the loop variable." - This may be where the confusion is coming from. Python isn't using the element
a[-1]
evaluates to, rather, it's using the index a[-1]
itself. If you rephrase that statement, your answer becomes much more clear.– Christian Dean
22 mins ago
|
show 3 more comments
Kundan Verma is a new contributor. Be nice, and check out our Code of Conduct.
Kundan Verma is a new contributor. Be nice, and check out our Code of Conduct.
Kundan Verma is a new contributor. Be nice, and check out our Code of Conduct.
Kundan Verma is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55644201%2fwhy-can-i-use-a-list-index-as-an-indexing-variable-in-a-for-loop%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
7
Somehow this question looks like a bad and newbie question, but I don't get the logic either lol
– gameon67
56 mins ago
4
I don't know why you would ever want to do this, but now I know you can
– Nathan
54 mins ago
over the iteration only the last time a[-1] gets its value, all other times python treats as iteration variable.
– Arun Augustine
50 mins ago
7
This would be a great question for an awful coding interview
– Nathan
47 mins ago
1
OP, since it seems like your post may be gaining some traffic, I edited your post in an attempt to make your question clearer. If I'm misinterpreting your question, you can rollback the edit.
– Christian Dean
26 mins ago