python alias
Embed Size (px)
TRANSCRIPT
-
8/6/2019 Python Alias
1/52
Python
Copyright Software Carpentry 2010
This work is licensed under the Creative Commons Attribution LicenseSee http://software-carpentry.org/license.html for more information.
-
8/6/2019 Python Alias
2/52
An aliasis a second name for a piece of data
Python Aliasing
-
8/6/2019 Python Alias
3/52
An aliasis a second name for a piece of dataOften easier (and more useful) than making a
Python Aliasing
-
8/6/2019 Python Alias
4/52
An aliasis a second name for a piece of dataOften easier (and more useful) than making a
If the data is immutable, aliases don't matter
Python Aliasing
-
8/6/2019 Python Alias
5/52
An aliasis a second name for a piece of dataOften easier (and more useful) than making a
If the data is immutable, aliases don't matter
Because the data can't change
Python Aliasing
-
8/6/2019 Python Alias
6/52
-
8/6/2019 Python Alias
7/52
Aliasing happens whenever one variable's valueis assigned to another variable
Python Aliasing
-
8/6/2019 Python Alias
8/52
' '
Aliasing happens whenever one variable's valueis assigned to another variable
variablevariablevariablevariable valuevaluevaluevalue
Python Aliasing
first 'isaac'
-
8/6/2019 Python Alias
9/52
' '
Aliasing happens whenever one variable's valueis assigned to another variable
second = first
variablevariablevariablevariable valuevaluevaluevalue
Python Aliasing
first
second
'isaac'
-
8/6/2019 Python Alias
10/52
' '
Aliasing happens whenever one variable's valueis assigned to another variable
second = first
variablevariablevariablevariable valuevaluevaluevalue
But as we've already seen
Python Aliasing
first
second
'isaac'
-
8/6/2019 Python Alias
11/52
' '
Aliasing happens whenever one variable's valueis assigned to another variable
second = first
variablevariablevariablevariable valuevaluevaluevaluefirst = first + ' newton'
But as we've already seen
Python Aliasing
first
second
'isaac'
'isaac newton'
-
8/6/2019 Python Alias
12/52
But lists are mutable
Python Aliasing
-
8/6/2019 Python Alias
13/52
But lists are mutable
first = ['isaac']
variablevariablevariablevariable valuevaluevaluevalue
first
Python Aliasing
'isaac'
-
8/6/2019 Python Alias
14/52
But lists are mutable
first = ['isaac']
=
variablevariablevariablevariable valuevaluevaluevalue
first
Python Aliasing
second
'isaac'
-
8/6/2019 Python Alias
15/52
But lists are mutable
first = ['isaac']
=
variablevariablevariablevariable valuevaluevaluevalue
first
first = first.append('newton')
printprintprintprint first
['isaac', 'newton']
Python Aliasing
second
'isaac' 'newton'
-
8/6/2019 Python Alias
16/52
But lists are mutable
first = ['isaac']
=
first = first.append('newton')
printprintprintprint first
['isaac', 'newton']
printprintprintprint second['isaac', 'newton'] variablevariablevariablevariable valuevaluevaluevalue
first
Python Aliasing
second
'isaac' 'newton'
-
8/6/2019 Python Alias
17/52
But lists are mutable
first = ['isaac']
=
first = first.append('newton')
printprintprintprint first
['isaac', 'newton']
printprintprintprint second['isaac', 'newton'] variablevariablevariablevariable valuevaluevaluevalue
first
Python Aliasing
second
'isaac' 'newton'
n t exp c t ymodify second
-
8/6/2019 Python Alias
18/52
But lists are mutable
first = ['isaac']
=
first = first.append('newton')
printprintprintprint first
['isaac', 'newton']
printprintprintprint second['isaac', 'newton'] variablevariablevariablevariable valuevaluevaluevalue
first
Python Aliasing
second
'isaac' 'newton'
n t exp c t ymodify second
A side effect
-
8/6/2019 Python Alias
19/52
Example: use lists of liststo implement a 2D grid
Python Aliasing
-
8/6/2019 Python Alias
20/52
3
Example: use lists of liststo implement a 2D grid
7
5
5
2
6
7 5 8
5 6 3
3 2 4
Python Aliasing
8
4
3
-
8/6/2019 Python Alias
21/52
3
Example: use lists of liststo implement a 2D grid
7
5
5
2
6
7 5 8
5 6 3
3 2 4
grid
Python Aliasing
8
4
3
-
8/6/2019 Python Alias
22/52
3
Example: use lists of liststo implement a 2D grid
7
5
5
2
6
7 5 8
5 6 3
3 2 4
grid[0]
Python Aliasing
8
4
3
-
8/6/2019 Python Alias
23/52
3
Example: use lists of liststo implement a 2D grid
7
5
5
2
6
7 5 8
5 6 3
3 2 4
grid[0][1]
Python Aliasing
8
4
3
-
8/6/2019 Python Alias
24/52
# Correct code
grid = []
forforforfor x inininin range(N):
temp = []
forforforfor y inininin range(N):
temp.append(1)
grid.append(temp)
Python Aliasing
-
8/6/2019 Python Alias
25/52
# Correct code
grid = []
forforforfor x inininin range(N):
temp = []
Outer "spine" of structure
forforforfor y inininin range(N):
temp.append(1)
grid.append(temp)
Python Aliasing
-
8/6/2019 Python Alias
26/52
# Correct code
grid = []
forforforfor x inininin range(N):
temp = []
forforforfor y inininin range(N):
temp.append(1)
grid.append(temp)
Add N sub-lists to outer list
Python Aliasing
-
8/6/2019 Python Alias
27/52
# Correct code
grid = []
forforforfor x inininin range(N):
temp = []
forforforfor y inininin range(N):
temp.append(1)
grid.append(temp)
Create a sublist of N 1's
Python Aliasing
-
8/6/2019 Python Alias
28/52
# Equivalent code
grid = []
forforforfor x inininin range(N):
grid.append([])
forforforfor y inininin range(N):
grid[-1].append(1)
Python Aliasing
-
8/6/2019 Python Alias
29/52
# Equivalent code
grid = []
forforforfor x inininin range(N):
grid.append([])
forforforfor y inininin range(N):
grid[-1].append(1)
Last element of outer list is the sublist currently
Python Aliasing
e ng e n
-
8/6/2019 Python Alias
30/52
# Incorrect code
grid = []
EMPTY = []
forforforfor x inininin range(N):
grid.append(EMPTY)
forforforfor y inininin range(N):
grid[-1].append(1)
Python Aliasing
-
8/6/2019 Python Alias
31/52
# Incorrect code
grid = []
EMPTY = []
forforforfor x inininin range(N):
# Equivalent code
grid = []
forforforfor x inininin range(N):
grid.append(EMPTY)
forforforfor y inininin range(N):
grid[-1].append(1)
grid.append([])
forforforfor y inininin range(N):
grid[-1].append(1)
Python Aliasing
-
8/6/2019 Python Alias
32/52
# Incorrect code
grid = []
EMPTY = []
forforforfor x inininin range(N):
Aren't meaningful variable
grid.append(EMPTY)
forforforfor y inininin range(N):
grid[-1].append(1)
a good thing?
Python Aliasing
-
8/6/2019 Python Alias
33/52
variablevariablevariablevariable valuevaluevaluevalue
grid = []
EMPTY = []
x 0
grid.append(EMPTY)
forforforfor y inininin range(N):
grid[-1].append(1)
grid
EMPTY
Python Aliasing
-
8/6/2019 Python Alias
34/52
variablevariablevariablevariable valuevaluevaluevalue
grid = []
EMPTY = []
x 0
grid.append(EMPTY)
forforforfor y inininin range(N):
grid[-1].append(1)
grid
EMPTY
Python Aliasing
-
8/6/2019 Python Alias
35/52
variablevariablevariablevariable valuevaluevaluevalue
grid = []
EMPTY = []
x 0
grid.append(EMPTY)
forforforfor y inininin range(N):
grid[-1].append(1)
y
grid
EMPTY
0
Python Aliasing
-
8/6/2019 Python Alias
36/52
variablevariablevariablevariable valuevaluevaluevalue
grid = []
EMPTY = []
x 0
grid.append(EMPTY)
forforforfor y inininin range(N):
grid[-1].append(1)
y
grid
EMPTY
0
Python Aliasing
1
-
8/6/2019 Python Alias
37/52
variablevariablevariablevariable valuevaluevaluevalue
grid = []
EMPTY = []
x 0
grid.append(EMPTY)
forforforfor y inininin range(N):
grid[-1].append(1)
y
grid
EMPTY
2
Python Aliasing
1 1 1
-
8/6/2019 Python Alias
38/52
variablevariablevariablevariable valuevaluevaluevalue
grid = []
EMPTY = []
x 1
grid.append(EMPTY)
forforforfor y inininin range(N):
grid[-1].append(1)
y
grid
EMPTY
2
Python Aliasing
1 1 1
-
8/6/2019 Python Alias
39/52
variablevariablevariablevariable valuevaluevaluevalue
grid = []
EMPTY = []
x 1
grid.append(EMPTY)
forforforfor y inininin range(N):
grid[-1].append(1)
y
grid
EMPTY
2
Python Aliasing
1 1 1
You see the problem...
-
8/6/2019 Python Alias
40/52
No Aliasing
second = []
Python Aliasing
-
8/6/2019 Python Alias
41/52
No Aliasing Aliasing
second = [] second = first
Python Aliasing
-
8/6/2019 Python Alias
42/52
-
8/6/2019 Python Alias
43/52
variablevariablevariablevariable valuevaluevaluevalue
grid = []
forforforfor x inininin range(N):
x 0
.
forforforfor y inininin range(N):
grid[-1].append(1)grid
Python Aliasing
-
8/6/2019 Python Alias
44/52
variablevariablevariablevariable valuevaluevaluevalue
grid = []
forforforfor x inininin range(N):
x 0
.
forforforfor y inininin range(N):
grid[-1].append(1)
y
grid
2
Python Aliasing
1 1 1
-
8/6/2019 Python Alias
45/52
variablevariablevariablevariable valuevaluevaluevalue
grid = []
forforforfor x inininin range(N):
x 1
.
forforforfor y inininin range(N):
grid[-1].append(1)
y
grid
2
Python Aliasing
1 1 1
-
8/6/2019 Python Alias
46/52
variablevariablevariablevariable valuevaluevaluevalue
grid = []
forforforfor x inininin range(N):
x 1
.
forforforfor y inininin range(N):
grid[-1].append(1)
y
grid
0
Python Aliasing
1 1 1
1
-
8/6/2019 Python Alias
47/52
If aliasing can cause bugs, why allow it?
Python Aliasing
-
8/6/2019 Python Alias
48/52
If aliasing can cause bugs, why allow it?
1. Some languages don't
Python Aliasing
-
8/6/2019 Python Alias
49/52
If aliasing can cause bugs, why allow it?
1. Some languages don't
Python Aliasing
-
8/6/2019 Python Alias
50/52
If aliasing can cause bugs, why allow it?
1. Some languages don't
2. Aliasing a million-element list is more efficient
than copying it
Python Aliasing
-
8/6/2019 Python Alias
51/52
If aliasing can cause bugs, why allow it?
1. Some languages don't
2. Aliasing a million-element list is more efficient
than copying it
3. Sometimes really do want to update a structure
Python Aliasing
-
8/6/2019 Python Alias
52/52
created by
Greg Wilson
c o er
Copyright Software Carpentry 2010
This work is licensed under the Creative Commons Attribution License
See http://software-carpentry.org/license.html for more information.